在使用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。