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

标签 c ffmpeg libavcodec

问题
我正在用 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 我已经看到 AVCodec在 ffmpeg 中称为 ff_h264_decoder ,而在我的代码中,gdb 不知道哪个特定类型是编解码器。 ff后缀让我认为这是并行解码器(因为它看起来像 ff 与 ffmpeg 上下文中的并行有关( https://ffmpeg.org/doxygen/2.7/pthread__frame_8c.html ))。但是,我似乎无法获得此编解码器。
我可以做些什么来使用 C 中的 libavcodec 并行解码视频?

最佳答案

发帖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)

关于c - 在 libavcodec/ffmpeg 中使用并行解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63533564/

相关文章:

使用传递的字符串创建列表节点

c - 如何将 Libextractor 中的元数据获取到结构中

php - 已安装 ffmpeg 但我收到 "no such file or directory"错误

ffmpeg - Aws lambda 使用预安装的二进制文件中的自定义 linux 命令

ffmpeg - 如何创建 WebM 视频文件?

c++ - 在 UDP (MPEGTS) 中流式传输时 FFMPEG 损坏的帧

c++ - 使用ffmpeg(libavcodec)通过RTP解码H264视频的问题

c - 副作用、序列点和未定义的行为

ffmpeg - libavformat 在编码时生成没有大小的 flv 文件

c - 使用 malloc 和 realloc 来使用 C struct,但占用的内存空间是我计算的两倍