我是ffmpeg开发的新手,我想知道是否有可能通过使用相同输入文件在不同机器(使用不同编译器编译)上使用libx264编码器运行ffmpeg来获得相同的位精确输出相同的配置选项?
如果可能,在编译libx264 / ffmpeg时是否需要设置其他配置选项?如果不可能,为什么?
以下是我运行两个版本的ffmpeg与libx264的输出,它产生不同的MD5输出哈希值。
通过OSX上的自制软件安装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
答案 0 :(得分:2)
如果在不同的CPU上使用不同版本的libx264,则没有人可以保证您的输出相同。使用相同的libx264构建在不同的CPU(支持不同的指令集扩展)上,您也可以获得不同的输出,但可以尝试通过在编码期间使用--cpu-independent param(对于ffmpeg到-x264-params)来修复它(在两者上)。
至于为什么不能使用不同的libx264构建是因为不同的编译器可以生成不同的float-math代码,这些代码在舍入错误方面会有所不同(使用x87或sse),因此无法保证。您可以尝试通过禁用AQ,MBTree或使用CQP速率控制来最小化概率,但这就是全部。
更新。另外,不要忘记在不同的CPU上使用相同的线程号而不是自动。
答案 1 :(得分:0)
在运行于i7 vs i9s的docker机器上进行测试时,我遇到了这个问题。最初,我尝试在https://github.com/FFmpeg/FFmpeg/blob/master/configure
中禁用不同的cpu功能但是后来我注意到两台机器都使用相同的cpu功能。我从运行命令输出的日志中看到了这一点。因此,我在日志中看到它们具有不同的线程数和lookahead_thread计数。因此,我通过使用此参数-x264-params threads=6:lookahead_threads=1