【问题标题】:ffmpeg libx264 encoder different machines different outputffmpeg libx264编码器不同机器不同输出
【发布时间】:2018-04-04 12:49:26
【问题描述】:

我是使用 ffmpeg 开发的新手,我想知道是否可以通过在具有相同输入文件和相同配置的不同机器(使用不同编译器编译)上使用 libx264 编码器运行 ffmpeg 来获得相同的位精确输出选项?

如果可以的话,编译libx264/ffmpeg时是否需要设置额外的配置选项?如果不可能,为什么?

以下是我在 ffmpeg 上使用 libx264 运行的两个版本的输出,它们会产生不同的输出 MD5 哈希值。

在 OSX 上通过 homebrew 安装的 ffmpeg

ffmpeg version 3.4 Copyright (c) 2000-2017 the FFmpeg developers
  built with Apple LLVM version 9.0.0 (clang-900.0.38)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.4 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --disable-lzma --enable-nonfree

Alpine Linux 上的 ffmpeg(在基于 https://github.com/jrottenberg/ffmpeg/blob/master/docker-images/3.4/alpine/Dockerfile 的 Docker 容器中)

ffmpeg version 3.4 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 6.2.1 (Alpine 6.2.1) 20160822
  configuration: --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --disable-lzma --enable-nonfree --prefix=/opt/ffmpeg

在 OSX 上使用 ffmpeg 测试运行

ffmpeg -i seg.ts -c:v libx264 -s 1280x720 -minrate 6000k -maxrate 6000k -bufsize 6000k -r 60 -threads 1 -f md5 -

输出

MD5=b7c84c0bae5da6749e389a5b69d88582

在 Alpine Linux 上使用 ffmpeg 测试运行(在基于 https://github.com/jrottenberg/ffmpeg/blob/master/docker-images/3.4/alpine/Dockerfile 的 Docker 容器中)

docker run --rm -v /code/:/tmp/workdir -w=/tmp/workdir ffmpeg -i seg.ts -c:v libx264 -s 1280x720 -minrate 6000k -maxrate 6000k -bufsize 6000k -r 60 -threads 1 -f md5 -

输出

MD5=c46af8fbdbbb2bfbb9f7042ab28accfc

【问题讨论】:

  • 出于好奇:你为什么需要这个?
  • 对于调试:计算这个哈希值仅用于解码。我可以想象已经存在一些差异(在某些情况下:例如一些音频编解码器)。
  • 尝试检查编码是否在一台机器上与另一台机器正确执行。在没有-c:v libx264 的情况下运行 ffmpeg 会导致每台机器的哈希值相同。
  • 只是为了清楚并排除任何明显的东西:您是否能够在同一操作系统上使用相同的 ffmpeg 命令行生成相同的 MD5?
  • 您是否尝试过使用固定比特率 -b:v 和恒定比特率 -vbr off

标签: ffmpeg video-encoding x264 libx264


【解决方案1】:

如果你在不同的 CPU 上使用不同的 libx264 版本,没人能保证你的输出是一样的。在不同的 CPU 上构建相同的 libx264(支持不同的指令集扩展),您也可以获得不同的输出,但可以尝试在编码期间使用 --cpu-independent 参数(对于 ffmpeg 到 -x264-params)来修复它(两者)。

至于为什么不能使用不同的 libx264 构建是因为不同的编译器可以生成不同的浮点数学代码,这些代码在舍入误差方面会有所不同(使用 x87 或 sse),因此没有任何保证。您可以尝试通过禁用 AQ、MBTree 或使用 CQP 速率控制来最小化概率,但仅此而已。

更新。也不要忘记在不同的 CPU 上使用相同的线程数而不是 auto。

【讨论】:

  • 我什至怀疑,与编码文件时的线程活动相比,您无法在同一台机器上获得相同的结果。这需要很多实验来确保这一事实。
  • 如果您对 libx264 的输入是确定性的并且您不使用 VBV 或 --non-deterministic 参数,那么在同一台机器和相同的 libx264 构建输出是确定性的。如果您使用单线程编码,VBV 是确定性的。
【解决方案2】:

我在 i7 和 i9s 上运行的 docker 机器上进行测试时遇到了这个问题。起初我尝试在 https://github.com/FFmpeg/FFmpeg/blob/master/configure 中禁用不同的 cpu 功能

但后来我注意到两台机器都使用相同的 cpu 功能。我从运行命令输出的日志中看到了这一点。然后我在日志中看到他们有不同的线程和lookahead_thread 计数。所以我通过使用这个参数指定计数来更新-x264-params threads=6:lookahead_threads=1

看到这个帖子https://streaminglearningcenter.com/blogs/ffmpeg-command-threads-how-it-affects-quality-and-performance.html

【讨论】:

    猜你喜欢
    • 2021-08-05
    • 2018-11-14
    • 2018-05-09
    • 2010-11-28
    • 2015-11-05
    • 2016-06-27
    • 2012-08-26
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多