2012-05-19 93 views
8

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

回答

7

找到在FFmpeg documentation

在阻塞操作,回调调用与不透明作为 参数。如果回调返回1,阻止操作将会中止 。

下面是声明int_cb从您的代码类型AVIOInterruptCB结构的变量:

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; 
} 
+0

你好,谢谢,是的,我读过,我不知道什么o包含。 – Sean

+0

好的 - 那我该在那里放什么?如果它是一个静态常量,它不会很好地与多个实例... – Sean

+0

确定辉煌,谢谢!通过访问formatContext,我该如何检测到流已超时? – Sean

2

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