ffmpeg连接超时与解码超时

举报
风吹稻花香 发表于 2021/06/05 00:23:30 2021/06/05
【摘要】 ffmpeg超时时间应该有两个,连接超时时间和解码超时时间,但是现在只有一个参数,本文告诉你一种解决方案     // Set the RTSP Options     AVDictionary *opts = 0;     if (usesTcp) {   &...

ffmpeg超时时间应该有两个,连接超时时间和解码超时时间,但是现在只有一个参数,本文告诉你一种解决方案


    // Set the RTSP Options
    AVDictionary *opts = 0;
    if (usesTcp) {
       // av_dict_set(&opts, "rtsp_transport", "tcp", 0);
    }
     av_dict_set(&opts, "timeout", "6000", 0); // in ms
   av_dict_set(&opts, "timeout", "0", 0); // 表示一直等待。
  av_dict_set(&opts, "timeout", "-1", 0); // 不能正常收数据
    // 打開影片檔案
    if (avformat_open_input(&pFormatCtx, [moviePath UTF8String], NULL, &opts) != 0) {
        av_log(NULL, AV_LOG_ERROR, "Couldn't open file\n");
        goto initError;
    }

后果:
解决了问题:如果开始连接不上,程序一直卡在 avformat_open_input,导致第二次连接,即使有数据也不能播放。
产生了新问题:一旦网络失败,就会断开,自动重连的功能就没有了,以前是如果没有数据,就一直等着,数据来了就自动重连。

解码超时问题:
h->rw_timeout = s->timeout;

int ffurl_read(URLContext *h, unsigned char *buf, int size)
{
    if (!(h->flags & AVIO_FLAG_READ))
        return AVERROR(EIO);
    return retry_transfer_wrapper(h, buf, size, 1, h->prot->url_read);
}


调用地方:



av_log(NULL, AV_LOG_ERROR, "lbg ffurl_read 12\n");
  *s = avio_alloc_context(buffer, buffer_size, h->flags & AVIO_FLAG_WRITE, h,
                          (void*)ffurl_read, (void*)ffurl_write, (void*)ffurl_seek);


声明:avio.h文件:

AVIOContext *avio_alloc_context(
                  unsigned char *buffer,
                  int buffer_size,
                  int write_flag,
                  void *opaque,
                  int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
                  int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
                  int64_t (*seek)(void *opaque, int64_t offset, int whence));


接收数据调用:

static void fill_buffer(AVIOContext *s)
{


解决OK:


#include "ffmpeg/libavformat/url.h"


AVIOContext * pb= player->input_format_ctx->pb;
if(pb){
    URLContext *hd=(URLContext *)pb->opaque;
    if(hd){
     hd->rw_timeout=0;
      //  AesContext *c = hd->priv_data;
      //  if(c){
     //   URLContext *h=c->hd;
     //   h->rw_timeout=0;
     // LOGE(3,"11111111111111111111111111%d",h->rw_timeout);
     // }
  }
}

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/54427966

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。