FFmpeg 增加中断函数
该方式主要针对avformat_open_input和av_read_frame延时问题
直接放代码
using my_time_t = std::chrono::system_clock::time_point;
class timeout_handler {
public:
timeout_handler(unsigned int timeout_ms) : timeout_ms_(timeout_ms) {}
void reset(unsigned int timeout_ms) {
timeout_ms_ = timeout_ms;
lastTime_ = std::chrono::system_clock::now();
}
bool is_timeout() {
unsigned int actualDelay = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()- lastTime_).count();
return actualDelay > timeout_ms_;
}
static int check_interrupt(void * ctx) {
if (!ctx) {
return 0;
}
return static_cast<timeout_handler *>(ctx)->is_timeout();
}
private:
unsigned int timeout_ms_;
my_time_t lastTime_;
};
这段代码也是参考stackflow上面的。下面展示用法:
int main() {
...初始化参数...
th = new timeout_handler(10000);
ifmt_ctx->interrupt_callback.callback = &timeout_handler::check_interrupt; //注册回调函数
ifmt_ctx->interrupt_callback.opaque = (void*)th ;
...
th->reset(500); //在你想要控制时间的函数前设置,单位毫秒。
ret = avformat_open_input(&ifmt_ctx, filename, NULL, &dict);
...
ret = avformat_find_stream_info(ifmt_ctx, NULL);
...
while (1) {
th->reset(50);
ret = av_read_frame(***);
if (ret == 0) {
...
}
}
}
大致用法如上。