子标题:FFmpeg命令录制RTMP流为FLV文件时如何设置超时时间 | FFmpeg命令如何解决录制产生阻塞的问题  
0x001: 前言

今天在测试程序时遇到两个问题。
Q1:ffmpeg录制RTMP流并保存为FLV文件时,推RTMP流的线程已经结束断掉了,而录制的线程却还一直在录。
Q2:ffmpeg录制RTMP流并保存为FLV文件时,被录制的RTMP流并未推流或并无此房间频道,而录制的线程却还一直在录。

观察日志文件发现录制程序一直阻塞在某个时间点上,经查验这是因为ffmpeg在拉取RTMP流时只要流媒体服务器能正常访问,不管当前拉取的流是否能正常访问都不会退出。
举个例子:rtmp://192.168.1.100:1935/live/changfang,只要192.168.1.100:1935这个服务器地址是能正常请求通的,不管当前changfang频道有没有在推流,ffmpeg都会阻塞至此。当你把整个服务器down掉,你会发现ffmpeg录制的程序会立马退出不再阻塞。此时第一个想法就是寻找设置超时的命令参数。

0x002: 解决方案

遇到问题就找找有没有前人也遇到类似情况,找了一遍基本是C++代码如何解决的问题,没有ffmpeg命令相关的结果。于是查看命令帮助,寻找timeout字眼,找了很多参数,经多次尝试发现有个 -rw_timeout

这是官方描述:
-rw_timeout <int64> ED....... Timeout for IO operations (in microseconds) (from 0 to I64_MAX) (default 0)

读取流也属于IO操作,但此处要注意两点:1.参数单位是微秒,而不是秒。1秒(s)=1000000微秒(μs)   2.参数要放在开流前,否则不会生效

更改前的命令(为了便于分析观看,只留最基础的命令):

ffmpeg -i rtmp://192.168.1.100:1935/live/changfang -c copy -f flv /opt/video/123.flv

更改后的命令:

ffmpeg -rw_timeout 5000000 -i rtmp://192.168.1.100:1935/live/changfang -c copy -f flv /opt/video/123.flv

这样,不管是推流结束还是从未推过流,只要ffmpeg在开流时,IO操作超过设置的秒数,就会自动退出。(如果你读取的流是外网流或内网流不太通畅的情况下,不建议你把此时间设置过短,因为ffmpeg在录制时从开流到产生FLV录制文件也需要时间)

0x003: 完结

如果你正好遇到此问题,希望能帮到你!

FFmpeg命令读取RTMP流如何设置超时时间的更多相关文章

  1. Go基础系列:为select设置超时时间

    Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 After() 谁也无法保证某 ...

  2. 爬虫学习笔记之为什么要设置超时时间,怎么设置(使用selenium)

    一个程序没有设置超时时间,就可以说是一段有缺陷的代码. 读取超时指的就是客户端等待服务器发送请求的时间.(特定地,它指的是客户端要等待服务器发送字节之间的时间.在 99.9% 的情况下这指的是服务器发 ...

  3. C# UdpClient 设置超时时间

    /********************************************************************** * C# UdpClient 设置超时时间 * 说明: ...

  4. mongodb3.6 (五)net 客户端访问mongodb设置超时时间踩过的“坑”

    前言 在上一篇文章中,我们有提到net访问mongodb连接超时默认为30秒,这个时间在实际项目中肯定是太长的.而MongoClientSettings 也确是提供了超时属性,如下图: 可实际使用中, ...

  5. GuzzleHttp 请求设置超时时间

    之前调用一个三方的 WEB API,大量的请求超时,导致 PHP 进程被占用完.整个网站一直报 504. 其中一个优化措施就是对三方 API 调用设置超时时间. use GuzzleHttp\Clie ...

  6. Mybatis设置超时时间

    Mybatis设置超时时间 mybatis如果不指定,默认超时时间是不做限制的,默认值为0.mybatis sql配置超时时间有两种方法: 1.全局配置 在mybatis配置文件的settings节点 ...

  7. winform设置超时时间

    ); //设置超时时间 var completedTask = await Task.WhenAny(new Task(async () => { );//执行的方法示例这里用延迟代替 }), ...

  8. HttpClient 如何设置超时时间

    今天分享一个巨坑,就是 HttpClient.这玩意有多坑呢?就是每个版本都变,近日笔者深受其害. 先看一下代码,我要发送请求调用一个c++接口. public static String doPos ...

  9. scrapy 如何使用代理 以及设置超时时间

    使用代理 1. 单文件spider局部使用代理 entry = 'http://xxxxx:xxxxx@http-pro.abuyun.com:xxx'.format("帐号", ...

随机推荐

  1. 趣谈编程史第2期-这个世界缺少对C语言的敬畏,你不了解的C语言科普

    这是我制作的编程语言科普系列视频的第二期,博客根据视频文案整理而成,提供给有需要的朋友阅读或使用. 视频地址:https://www.bilibili.com/video/av83627932/    ...

  2. Spring-cloud微服务实战【三】:eureka注册中心(中)

      回忆一下,在上一篇文章中,我们创建了两个springboot项目,并且在consumer项目中通过restTemplate进行HTTP通信,成功访问到了producer提供的接口,思考一下这样的实 ...

  3. html转成pdf 下载,支持后台保存

    最近有个需求,需要将html转换成pdf并支持下载 1.需要两个js库 下载 提取码: vab7 <script type="text/javascript" src=&qu ...

  4. 匈牙利算法(Kuhn-Munkres)算法

    这个算法有点难度,一般比较标准的描述网页上也有相关的描述,我在这里就简单的用十分通俗的语言给大家入个门 主要可以结合https://blog.csdn.net/zsfcg/article/detail ...

  5. python 面向对象-初识

    一.分类 1.面向过程 2.面向函数 3.面向对象 二.类和对象 1.宏关 类是抽象的,对象是具体的 2.实例化 类->对象 3.类的作用 1)实例化成对象 实例化的过程,创建self对象,调用 ...

  6. [bzoj3527] [洛谷P3338] [Zjoi2014]力

    Description 给出n个数qi,给出Fj的定义如下: \[ F_j=\sum\limits_{i<j} \frac{q_iq_j}{(i-j)^2} - \sum\limits_{i&g ...

  7. Sublime Text 3 部分安装过程记录

    概览: Sublime Text 3下载网址 Package Control的安装 Install Package报错(There are no packages availabel for inst ...

  8. test api formdata

  9. 废旧手机利用之装一个Linux系统

    开篇: 在废旧手机变废为宝的路上一直没有停下,做过电脑遥控器,家居监控器,给电脑扩展屏幕以及跟着大佬学过智能机器人,但是都是一时兴趣,除了家具监控器目前正在使用之外其他也没有使用了. 最近在学习Lin ...

  10. 谈谈模型融合之三 —— GBDT

    前言 本来应该是年后就要写的一篇博客,因为考完试后忙了一段时间课设和实验,然后回家后又在摸鱼,就一直没开动.趁着这段时间只能呆在家里来把这些博客补上.在之前的文章中介绍了 Random Forest ...