ffmpge在RTMP推流时使用av_interleaved_write_frame/av_write_frame函数时阻塞,设置超时时间的方法

在使用ffmpeg进行推流时,有时网络连接会因为种种原因断开,这时av_interleaved_write_frame/av_write_frame函数就会阻塞长达15分钟左右,这怎么能行,下面就说一下如何设置最长的阻塞时间。

在使用命令行推流时

在使用命令行推流时,需要添加 -rw_timeout参数,单位微秒,如下,

更改前的命令

./ffmpeg  -i rtsp://admin:12345@192.168.31.113:8554/0 -c:v copy -f flv  rtmp://r.ossrs.net/live/xxx

更改后的命令

./ffmpeg  -i rtsp://admin:12345@192.168.31.113:8554/0 -c:v copy -rw_timeout 1000000  -f flv  rtmp://r.ossrs.net/live/xxx

在使用c/c++程序推流时

在使用c/c++程序推流时,添加超时参数的方法我找了好久,最后发现是需要通过avio_open2传入rw_timeout参数或设置回调函数。

简单介绍一下avio_open2参数的含义:

  • 前三个参数和avio_open的参数一样;
  • 第四个int_cb:是超时的回调函数,在回调函数里如果return 1则停止阻塞,return 0则继续阻塞,可以实现一些比较复杂的超时设置,具体使用方法自己研究吧,我这里主要说一下使用第五个参数的方法;
  • 第五个options里面可配置一些专用的选项,通过av_dict_set函数设置,我们可以通过这参数将rw_timeout参数传入,具体使用方法如下:
AVDictionary *format_opts = NULL;
av_dict_set(&format_opts, "rw_timeout",  "1000000", 0); //设置超时时间,单位mcs
avio_open2( &octx->pb, RTMP_OUTPUT_URL , AVIO_FLAG_WRITE , NULL , &format_opts);

format_opts所占据的空间在avio_open2返回后会自动释放,不需要我们手动free。

上一篇:全面介绍 Linux 权限


下一篇:Centos6.4 NFS的安装与配置