首页 > 其他分享 >FFmpeg:开流和读流超时设计

FFmpeg:开流和读流超时设计

时间:2023-03-17 11:12:45浏览次数:46  
标签:context 开流 NULL FFmpeg ctx 读流 设置 超时 opts

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

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

标签:context,开流,NULL,FFmpeg,ctx,读流,设置,超时,opts
From: https://www.cnblogs.com/lidabo/p/17225965.html

相关文章

  • ffmpeg4.0以上的阻塞超时设置
    //其实ffmpeg从4.0开始不用stimeout,用的listen_timeout等待网络超时,不然会一直超时下去。   AVDictionary*options=nullptr; //实时播放使用ud......
  • ffmpeg前端使用研究
    ffmpeg前端使用研究ffmpeg本质上是一套可执行文件。可以运行在windows、linux环境中。主要包含三部分(windows环境中讨论该问题):​​ffmpeg.exe​​​:主要用于编解码​​......
  • ffmpeg提取视频尾帧最快方式
    ffmpeg-sseof-1-iinput_video.mp4-frames:v1output_image.jpg这个命令将会:-sseof-1:使用-sseof选项并传递一个值-1来从视频的末尾开始读取。这意味着FFmpeg将......
  • 使用ffmpeg提取视频帧的时候降低图片质量
    当我们使用ffmpeg进行提取视频帧的时候,有些情况不希望帧的的体积小一点,这个时候就需要设置一下帧的保存质量,因为如果你不设置的话会默认使用最高质量。ffmpeg-iinput_vi......
  • 使用ffmpeg命令把单张或多张图片生成固定时长的视频
    windows环境注意事项:1、需先使用MSYS2编译安装ffmpeg+libx264,或下载内置libx264编码器的压缩包2、thinkphp6中执行ffmpeg命令时,需将ffmpeg.exe文件拷贝到public目录3......
  • 使用ffmpeg将图片拼接为视频
    本文介绍下如何使用ffmpeg将大量图片拼接成一个视频,并介绍其中部分参数的含义。 使用ffmpeg将图片拼接成视频前,需要将图片文件名做下预处理,文件名中必须有数字将其次序......
  • Windows下使用FFmpeg,完成当前文件夹下多个MP4视频的拼接
    目的单纯进行视频时长拼接,不改变两段视频各自的分辨率、码率等一切信息。一、安装FFmpeg方法1:Windows打开powershell,使用winget命令安装FFmpegwingetinstallffmpeg......
  • ffmpeg设置终端不显示日志
    在使用ffmpeg处理视频的时候,终端页面会输出大量日志,其实打印这些日志也是很耗时的,所以有时候没有显示,那么怎么关闭日志输出呢:要在使用FFmpeg时禁用日志输出,可以......
  • Qt-FFmpeg开发-视频播放【软解码 + OpenGL显示RGB图像】(3)
    Qt-FFmpeg开发-视频播放【软解码+OpenGL显示RGB图像】目录Qt-FFmpeg开发-视频播放【软解码+OpenGL显示RGB图像】1、概述2、实现效果3、FFmpeg软解码流程4、主要代码4.......
  • FFmpeg开发-视频播放【软/硬解码 + OpenGL显示YUV/NV12】05 转载
    1、概述最近研究了一下FFmpeg开发,功能实在是太强大了,网上ffmpeg3、4的文章还是很多的,但是学习嘛,最新的还是不能放过,就选了一个最新的ffmpegn5.1.2版本,和3、4版本api变化......