zoukankan      html  css  js  c++  java
  • ffmpeg拉流长时间堵塞解决方式

    由于网络堵塞或者推流端错误导致拉流端没有流数据,ffmpeg主要会堵塞两个函数,直到下次流数据的到来

    1. avformat_open_input()
      该函数是在打开流数据时,如果没有这个流的ip,http有自己的timeout,当链接失败,ffmpeg会自动断开.但是如果有这个ip,但是无法链接,就会堵塞,解决方式是添加超时控制.
      函数在ffmpeg源码的ffmpeg_opt.c文件中,

      我设置了3秒超时时间,添加如下代码
      av_dict_set(&o->g->format_opts, "rw_timeout", "3000000", 0);

    2. av_read_frame()
      该函数是链接成功后,由于网络堵塞或者其它问题导致packet丢失,无法读取,导致堵塞,
      函数在ffmpeg.c文件中,解决方式也是添加超时
      f->ctx->interrupt_callback.callback = CheckInterrupt;
      f->ctx->interrupt_callback.opaque = (void*)f->ctx;
      time_t start_time;
      start_time = time(NULL);
      int l = time(&start_time);
      f->ctx->st = l;
      return av_read_frame(f->ctx, pkt);

      下面是回调函数:
      static int CheckInterrupt(void *ctx)
      {
      AVFormatContext p = (AVFormatContext)ctx;
      time_t et;
      et = time(NULL);
      int l = time(&et);
      av_log(NULL, AV_LOG_WARNING,"start time%d ",p->st);
      av_log(NULL, AV_LOG_WARNING,"end time%d ",l);
      return l - p->st >= 10 ? 1 : 0;//3秒超时
      }

      需要注意的是,我在f->ctx结构体中添加了st变量,由时间戳作为评判超时的依据,需要把变量类型统一,所以需要添加变量如下:
      在avformat.h文件的AVFormatContext结构体中添加:
      int st;

  • 相关阅读:
    学生免费注册Pycharm
    CSS笔记
    加载CIFAR数据集时报错的大坑
    发布小程序
    微信中的动图如果发朋友圈
    安卓第一个小项目
    转换小写字母
    1小时搞定vuepress快速制作vue文档/博客+免费部署预览
    干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)
    JavaScript 加减危机——为什么会出现这样的结果?
  • 原文地址:https://www.cnblogs.com/vinic-xxm/p/13329591.html
Copyright © 2011-2022 走看看