在 libavcodec/ffmpeg 中使用并行解码器
Using parallel decoder in libavcodec/ffmpeg
问题
我正在用 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 并行解码视频?
张贴 gkv311 评论作为答案以供将来参考。
AVCodec
没有 multi-threading 功能。它存储在 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)
问题
我正在用 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 并行解码视频?
张贴 gkv311 评论作为答案以供将来参考。
AVCodec
没有 multi-threading 功能。它存储在 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)