检测FFmpeg中的超时问题。

11

我正在编写一些使用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拒绝在return 0;行上设置断点,声称该位置没有关联的可执行代码。有任何想法吗?

2个回答

10

以下内容来自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;

你将能够在 interrupt_cb 内部访问 formatContext 实例:

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

1
好的,太棒了!有了formatContext访问权限,我如何检测流是否已超时? - Sean
我不知道那个。尝试在回调函数内部添加某种追踪,以查看如果流超时会如何调用它。 - alexander

2
你不仅可以传递 AVFormatContext* formatContext,还可以传递其他指针,用于存储有用的数据以确定哪个线程超时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接