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
博客中所涉及到的图片都有版权,请谨慎使用