检测ffmpeg中的超时

时间:2012-05-19 14:56:24

标签: c++ ffmpeg

我正在编写一些广泛使用ffmpeg的软件,它是多线程的,具有多个类实例。

如果网络连接断开,ffmpeg会在读取时挂起。我找到了一个方法来分配一个ffmpeg定期触发的回调,以检查它是否应该中止:

static int interrupt_cb(void *ctx) 
{ 

// do something 
    return 0;
} 

static const libffmpeg::AVIOInterruptCB int_cb = { interrupt_cb, NULL }; 

...

AVFormatContext* formatContext = libffmpeg::avformat_alloc_context( );
formatContext->interrupt_callback = int_cb; 
if ( libffmpeg::avformat_open_input( &formatContext, fileName, NULL, NULL ) !=0 ) {...}

这一切都很好,但在网上我无处可以找到* ctx包含的内容以及如何确定回调是否应该返回1或0.我无法分配静态“abort”标志,因为该类有许多实例。我也无法调试代码因为某些原因,visual studio拒绝在返回0上设置断点;声明没有可执行代码与该位置相关联。有什么想法吗?

2 个答案:

答案 0 :(得分:7)

在ffmpeg documentation中找到:

  

在阻止操作期间,使用 opaque 调用回调   参数。如果回调返回1 ,则阻止操作将会   被中止。

这是从代码中声明类型AVIOInterruptCB结构的int_cb变量:

static const libffmpeg::AVIOInterruptCB int_cb = { interrupt_cb, NULL };

您将opaque参数声明为NULL

我建议像这样重写初始化代码:

AVFormatContext* formatContext = libffmpeg::avformat_alloc_context( );
formatContext->interrupt_callback.callback = interrupt_cb;
formatContext->interrupt_callback.opaque = formatContext;

您将能够访问interrupt_cb中的formatContext实例:

static int interrupt_cb(void *ctx) 
{ 
    AVFormatContext* formatContext = reinterpret_cast<AVFormatContext*>(ctx);
// do something 
    return 0;
}

答案 1 :(得分:2)

你不仅可以传递AVFormatContext * formatContext,还可以传递给某个实例的任何其他有用指针,其中包含有用的数据来确定哪个线程超时