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

本文介绍了在使用ffmpeg进行推流时,如何避免av_interleaved_write_frame/av_write_frame函数因网络问题长时间阻塞的问题。通过在命令行中添加`-rw_timeout`参数或者在C/C++程序中利用`avio_open2`设置超时时间,可以限制阻塞的最长时间,确保推流过程的稳定性。具体方法包括设置超时回调函数和通过`av_dict_set`传递超时参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值