加载中...

avformat_open_input阻塞操作中断的支持

avformat_open_input默认是阻塞操作,如果不加控制,等待时间可能会达到30s以上,对于有些情况,等待30s的体验是无法接受的。

ffmpeg支持interrupt_callback机制,可以对输入(或输出)的AVFormatContext的interrupt_callback成员设置,然后再回调函数中做控制。

// 回调函数的参数,用了时间
typedef struct {
	time_t lasttime;
} Runner;

// 回调函数
static int interrupt_callback(void *p) {
	Runner *r = (Runner *)p;
	if (r->lasttime > 0) {
		if (time(NULL) - r->lasttime > 8) {
			// 等待超过8s则中断
			return 1;
		}
	}
    
	return 0;
}


// usage
Runner input_runner = {0};

AVFormatContext *ifmt_ctx = avformat_alloc_context();
ifmt_ctx->interrupt_callback.callback = interrupt_callback;
ifmt_ctx->interrupt_callback.opaque = &input_runner;

input_runner.lasttime = time(NULL);
// 调用之前初始化时间
ret = avformat_open_input(&ifmt_ctx, url, NULL, NULL);
if(ret < 0) {
	// error
}

  

特别提醒: rtsp 可以使用 timeout 配置参数, rtmp 使用timeout 配置参数会报错(ffmpeg bug), 所以只能使用 回调来结束 avformat_open_input的阻塞行为

 

参考: 

https://www.suninf.net/2017/02/avformat_open_input-interrupt-callback.html

https://www.cnblogs.com/wainiwann/p/4218341.html

posted @ 2019-12-04 16:08  水车  阅读(3750)  评论(0编辑  收藏  举报