我注意到,h264_nvenc
与 FFmpeg 4.3/4.4 相比,使用简单的全硬件转码测试最近的 FFmpeg 5.1 版本时编码性能有所下降。
- 使用 FFmpeg 4.3 转码大约需要 92 秒(最新报告速度为 14.3 倍)。
- 使用 FFmpeg 5.1 转码大约需要 134 秒(上次报告的速度为 9.83 倍)。因此,这种
-hwaccel cuda -hwaccel_output_format cuda
使用似乎会导致编码速度变慢。
有没有类似的问题?有什么提示可以诊断这个问题吗?
输入文件
input.mp4 是一个视频,其中包含以下内容:
- 视频:21分51秒,H.264([电子邮件保护]), 720p, 25 fps, 892 kbps 比特率, yuv420p
- 音频:AAC,128 kbps,44.1 kHz
FFmpeg 调用
旧版 FFmpeg v4.3.1 的调用参数为:
ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:v h264_nvenc -b:v 2M output.mp4
新的 FFmpeg v5.1.3 版本带有调用参数:
ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -extra_hw_frames 8 -i input.mp4 -c:v h264_nvenc -b:v 2M output.mp4
构建和运行时
测试运行使用在 Docker 容器中创建的 ffmpeg 版本,并使用nvidia/cuda:12.0.1-devel-ubuntu22.04
并nvidia/cuda:12.0.1-base-ubuntu22.04
安装libnpp-12-0
为运行时映像。带有来自此标签的标头:https://github.com/FFmpeg/nv-codec-headers/archive/refs/tags/n12.0.16.0.tar.gz。
FFMPEG 使用以下配置构建:
RUN cd /tmp/ffmpeg-${FFMPEG_VERSION} && \
./configure \
--prefix=${PREFIX} \
--disable-debug \
--disable-doc \
--disable-ffplay \
--enable-version3 \
--enable-gpl \
--enable-nonfree \
--enable-small \
--enable-libfdk-aac \
--enable-openssl \
--enable-cuda \
--enable-cuvid \
--enable-nvenc \
--enable-libnpp \
--enable-nvenc \
--enable-shared \
--extra-cflags="-I${PREFIX}/include -I${PREFIX}/include/ffnvcodec -I/usr/local/cuda/include/" \
--extra-ldflags="-L${PREFIX}/lib -L/usr/local/cuda/lib64/" \
--extra-libs=-ldl && \
make && \
make install && \
make distclean && \
hash -r
硬件:NVIDIA GeForce RTX 2080、驱动程序版本:536.23、Windows 10 上的 Docker 4.24.1。基于 Kubernetes 的部署也报告了性能差异。
提前感谢您对此问题的评论和反馈。