c - 在 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 我已经看到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)
推荐阅读
- java - 如何使用反射转储或写入修改后的 java.lang.Class 到文件?
- sql - 如何在 Oracle SQL 中将 max(0.10)+1 设为 0.11
- parameters - ADF 运行管道,从文件中为每一行获取参数值
- javascript - 在 Google App Script 中指定 HTML/Javascript 表单
- excel - VBA提取多个zip文件
- macos - 如何找出当前在 OS X 下运行的 Mono 应用程序?
- json - 如何在 Oracle 11g 中使用 JSON_TABLE
- python - Django 服务器无法在 webbrowser 中启动
- ios - AppBox - 无法安装“YourApp”请稍后再试
- rust - Rust 'for 循环'(从 c++ 转换)