我正在编写一些广泛使用ffmpeg的软件,它是多线程的,具有多个类实例.
如果网络连接中断,ffmpeg会在读取时挂起.我找到了一个方法来分配一个ffmpeg定期触发的回调,以检查它是否应该中止:
static int interrupt_cb(void *ctx)
{
// do something
return 0;
}
static const libffmpeg::AVIOInterruptCB int_cb = { interrupt_cb, NULL };
Run Code Online (Sandbox Code Playgroud)
...
AVFormatContext* formatContext = libffmpeg::avformat_alloc_context( );
formatContext->interrupt_callback = int_cb;
if ( libffmpeg::avformat_open_input( &formatContext, fileName, NULL, NULL ) !=0 ) {...}
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但在网上无处可以找到*ctx包含的内容以及如何确定回调是否应返回1或0.我无法分配静态"abort"标志,因为该类有许多实例.我也无法调试代码因为某些原因,visual studio拒绝在返回0上设置断点; 声明没有可执行代码与该位置相关联.有任何想法吗?
在ffmpeg 文档中找到:
在阻塞操作期间,使用opaque作为参数调用回调.如果回调返回1,则阻止操作将被中止.
这是从代码中声明类型AVIOInterruptCB结构的int_cb变量:
static const libffmpeg::AVIOInterruptCB int_cb = { interrupt_cb, NULL };
Run Code Online (Sandbox Code Playgroud)
您将opaque参数声明为NULL.
我建议像这样重写初始化代码:
AVFormatContext* formatContext = libffmpeg::avformat_alloc_context( );
formatContext->interrupt_callback.callback = interrupt_cb;
formatContext->interrupt_callback.opaque = formatContext;
Run Code Online (Sandbox Code Playgroud)
你将能够访问里面的formatContext实例interrupt_cb:
static int interrupt_cb(void *ctx)
{
AVFormatContext* formatContext = reinterpret_cast<AVFormatContext*>(ctx);
// do something
return 0;
}
Run Code Online (Sandbox Code Playgroud)