ffmpeg连接超时与解码超时
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
- 点赞
- 收藏
- 关注作者
评论(0)