DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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,就通知外面超时断开。

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

posted on   DoubleLi  阅读(1021)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
历史上的今天:
2020-03-17 RTMP、RTSP、HTTP视频协议详解(附:直播流地址、播放软件)
2017-03-17 H265(HEVC) nal 单元头介绍及rtp发送中的fu分组发送详解
2015-03-17 Linux操作系统下三种配置环境变量的方法
2015-03-17 Linux中环境变量文件及配置
2015-03-17 Linux如何实现开机启动程序详解
2014-03-17 ActiveX控件的安全初始化和脚本操作 和 数字签名SIGN
2014-03-17 编写在浏览器中不弹出警告的ActiveX控件
点击右上角即可分享
微信分享提示