首页 购买软件

FFmpeg命令读取RTMP流如何设置超时时间

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: 完结
如果你正好遇到此问题,希望能帮到你!
———————————————————— 2020-11-20 11:14:23 ————————————————————

首先,感谢底部评论的那位兄台,给本博文弥补了空缺,为其他再有机会看本文的园友提供更明确的思路及填坑方法。
其次,这里再详细贴一下 -rw_timeout 与 -stimeout 的用途。
下面是命令帮助详细描述:

 


小姐(结):从帮助文档可以看出 -rw_timeout 的作用范围是 URLContext-stimeout 的作用范围是 RTSP demuxer  RTSP muxer 。

 

__EOF__

#1楼 2020-11-07 16:38 chg_miz

博主好,你的ffmpeg是官方下载的吗,我这边命令行显示没有-rw_timeout选项

#2楼 2020-11-07 16:45 chg_miz

在其他地方找到解决办法了,使用的是 -stimeout,如:ffmpeg -stimeout 5000000 -rtsp_transport tcp -i rtspXXX -f flv rtmpXXX

#3楼 [楼主2020-11-20 10:54 之乏

@chg_miz
是官方下载的,如果没有可能是你的版本问题,可以去下载最新发行版试一下。

#4楼 [楼主2020-11-20 11:00 之乏

@chg_miz
是的,-stimeout也可以解决超时问题,但需要注意的是:它是用来解决 rtsp demuxer 与 muxer 的,对于RTMP流并不适用,正如你给的demo 命令一样。
网上大部分是记录rtsp的超时解决,而RTMP却很少,这也是这篇博文的由来。

评论

评论关闭

备案:吉ICP备13003065号