FFmpeg:开流和读流超时设计

ffmpeg的avformat_open_input()和av_read_frame默认是阻塞的

 * 用户可以通过设置“ic->flags |= AVFMT_FLAG_NONBLOCK;”设置成非阻塞(通常是不推荐的);

 * 或者是设置超时时间;

 * 或者是设置interrupt_callback定义返回机制。

开流超时设计


主要注意点是要注意协议

 timeout:(http:ms udp:s)

 stimeout:(rtsp us)

1.设置rtsp超时

AVDictionary* opts = NULL;

av_dict_set(&opts, "rtsp_transport", m_bTcp ? "tcp" : "udp", 0); //设置tcp or udp,默认一般优先tcp再尝试udp

av_dict_set(&opts, "stimeout", "3000000", 0);//单位us 也就是这里设置的是3s

ret = avformat_open_input(&ctx, url, NULL, &opts);

2.设置udp,http超时

AVDictionary* opts = NULL;

av_dict_set(&opts, "timeout", "3000000", 0);//单位 如果是http:ms  如果是udp:s

int ret = avformat_open_input(&ctx, url, NULL, &opts);

 

读流超时设计


1.回调用的方式

//打开成功后 设置回调,监控read超时情况 通过这种方式可以动态修改

    context->ifmt_ctx->interrupt_callback.opaque = (void*)context;

    context->ifmt_ctx->interrupt_callback.callback = interruptCallback;//设置回调

//每次读流之前记录一下起始时间

context->read_start_time = time(NULL);

int ret = av_read_frame(context->ifmt_ctx, &pkt);

//回调监控

static int interruptCallback(void *context){

    ACCHLSContext *ctx = (ACCHLSContext *)context;//ACCHLSContext是我自定义的结构体,这是回调opaque设置的

    if (ctx == NULL) {

        return 0;

    }

    ACCUInt64_t end =  time(NULL);

    if (end - ctx->read_start_time >= 3) {

        return 1;

    }

    return 0;

}

2.参数设置

//不可动态设置,只能在开流之前设置好

AVDictionary* opts = NULL;

av_dict_set(&opts, "rw_timeout", "3000", 0);//单位:ms  

int ret = avformat_open_input(&ctx, url, NULL, &opts);

 

备注:我在做HLS拉流直播和点播时,由于点播的m3u8文件是实时生成的,理论上是3s生成一个文件,但如果网络不好,这时间就会很长。

如果按照这种设计,就很容易出现超时。但如果设置时间太长,关闭时又容易卡住线程。所以我的处理方式是:除了这个超时设计外,另外增加一设计。连续读流失败25s,就通知外面超时断开。

不知道还有没有其他好的方法,欢迎一起交流

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!如果您在使用ffmpeg时遇到了“ffmpeg: not found”的错误,这可能是因为ffmpeg未安装或未在系统的环境变量中被找到。请按照以下步骤进行操作: 1. 确认是否已安装ffmpeg:在终端或命令提示符中输入以下命令并按下回车: ``` ffmpeg -version ``` 如果ffmpeg已正确安装,将显示ffmpeg的版本信息。如果未安装,则需要安装ffmpeg。 2. 安装ffmpeg:根据您的操作系统和环境,可以选择不同的方式来安装ffmpeg。以下是一些常见操作系统上的安装方法: - 在Ubuntu上,可以使用以下命令安装ffmpeg: ``` sudo apt-get install ffmpeg ``` - 在CentOS上,可以使用以下命令安装ffmpeg: ``` sudo yum install ffmpeg ``` - 在macOS上,可以使用Homebrew来安装ffmpeg。如果尚未安装Homebrew,请先安装Homebrew,然后运行以下命令来安装ffmpeg: ``` brew install ffmpeg ``` - 在Windows上,可以从ffmpeg官方网站(https://www.ffmpeg.org/download.html)下载预编译的可执行文件,并将其添加到系统的环境变量中。 3. 添加ffmpeg到环境变量:如果已经安装了ffmpeg但仍然遇到问题,请确保ffmpeg所在的目录已添加到系统的环境变量中。详细步骤取决于您的操作系统,请参考相应的文档或搜索如何将目录添加到环境变量。 完成以上步骤后,重新启动终端或命令提示符,并尝试再次运行ffmpeg命令。如果仍然遇到问题,请提供更多详细信息以便我们进一步帮助您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值