gpt4 book ai didi

c++ - 在 ffmpeg 中检测超时

转载 作者:可可西里 更新时间:2023-11-01 17:42:09 29 4
gpt4 key购买 nike

我正在编写一些广泛使用 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 上设置断点;行,声称没有可执行代码与该位置相关联。有什么想法吗?

最佳答案

在ffmpeg中找到documentation :

During blocking operations, callback is called with opaque as parameter. If the callback returns 1, the blocking operation will be aborted.

这是来自您的代码的 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;
}

关于c++ - 在 ffmpeg 中检测超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10666242/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com