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
}

参考: https://ffmpeg.org/doxygen/3.2/structAVFormatContext.html