在 libavcodec/ffmpeg 中使用并行解码器

Posted

技术标签:

【中文标题】在 libavcodec/ffmpeg 中使用并行解码器【英文标题】:Using parallel decoder in libavcodec/ffmpeg 【发布时间】:2020-12-11 11:19:44 【问题描述】:

问题

我正在用 C 语言编写一个使用 libavcodec (https://github.com/Dr-Noob/framepos/blob/master/framepos.c) 的简单程序

我一直在处理 h264 视频。虽然解码工作正常,但我可以看到它非常慢,因为它只使用 1 个 CPU 内核(我用top 进行了检查)。另一方面,我知道使用我系统中安装的相同 libavocdec 的 ffmpeg 使用并行 h264 解码器。我可以通过以下方式对其进行测试:

ffmpeg -c:v h264 -i test.mkv -f null -

使用top 可以看到它是并行运行的,而且速度明显更快。我想要一个解决方案,它总是让我能够使用所有 CPU 内核来解码视频,而不仅仅是在 h264 编解码器的情况下。

到目前为止我的研究

查看ffmpeg代码可以看出,要获取AVCodec,它使用了函数find_codec_or_die。这最终将使用avcodec_find_decoder_by_name。实际上,如果我在我的程序中使用这个函数,要求h264 解码器,我仍然得到顺序版本。此外,在ffmpeg中使用gdb我看到ffmpeg中的AVCodec被称为ff_h264_decoder,而在我的代码中,gdb不知道哪个具体类型是编解码器。 ff 后缀让我觉得这是并行解码器(因为看起来 ff 与 ffmpeg 上下文中的并行有关(https://ffmpeg.org/doxygen/2.7/pthread__frame_8c.html))。但是,我似乎无法获得此编解码器。

如何在 C 中使用 libavcodec 并行解码视频?

【问题讨论】:

AVCodec 没有定义多线程——它是AVCodecContext::thread_count 属性(应该在avcodec_open2() 之前设置)ffmpeg.org/doxygen/2.7/structAVCodecContext.htm 【参考方案1】:

张贴gkv311 评论作为答案以供将来参考。

AVCodec 没有多线程功能。它存储在AVCodecContex 中。因此,并行运行编解码器的可行方案:

AVCodec *codec = avcodec_find_decoder
AVCodecContext *ctx = avcodec_alloc_context3

ctx->thread_count = n_threads;
ctx->thread_type = FF_THREAD_FRAME;

avcodec_open2(ctx, fmt_ctx->video_codec, NULL)

【讨论】:

以上是关于在 libavcodec/ffmpeg 中使用并行解码器的主要内容,如果未能解决你的问题,请参考以下文章

使用不同的参数并行运行相同的函数,并知道哪个并行运行在 python 中结束了

在 Haskell 中使用并行策略时速度变慢

在异步任务中并行使用 WebView2

在 API 中使用任务并行库

如何在 R 的并行方法中使用无效的记录器进行记录?

在android中使用PayPal实现并行支付