9

我正在编写一些广泛使用 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。我无法分配静态“中止”标志,因为该类有很多实例。我也无法调试代码,因为出于某种原因,Visual Studio 拒绝在返回 0 上设置断点;行,声称没有可执行代码与该位置相关联。有任何想法吗?

4

2 回答 2

8

在 ffmpeg文档中找到:

在阻塞操作期间,回调以opaque作为参数调用。如果回调返回 1,阻塞操作将被中止。

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

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

您将不透明参数声明为NULL.

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

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

您将能够访问内部的 formatContext 实例interrupt_cb

static int interrupt_cb(void *ctx) 
{ 
    AVFormatContext* formatContext = reinterpret_cast<AVFormatContext*>(ctx);
// do something 
    return 0;
}
于 2012-05-19T15:14:06.673 回答
2

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

于 2015-05-19T09:06:18.280 回答