当前位置: 首页 > 知识库问答 >
问题:

c++ - 关于相同转码参数下,不同版本ffmpeg压缩比差距很大的问题(使用videotoolbox硬编码)?

端木阳荣
2024-11-12

请教个问题:
我的mac电脑上有2个版本的ffmpeg,A版本的ffmpeg是使用brew安装的,B版本的是我自己编译的。代码的版本号都是7.0.1。
但是当我使用相同的参数去压缩同一个文件的时候,压缩比差距很大。
A版本的命令:
ffmpeg -i 1390942-uhd_4096_2160_24fps.mp4 -c:v h264_videotoolbox -b:v 12000k 1390942-uhd_4096_2160_24fps_after.mp4 -loglevel debug
B版本的命令:
/Users/hanyongqiang-mac/code/baidu/transcode/third_party/ffmpeg701/ffmpeg_build_macos/mac_arm64/bin/ffmpeg -i 1390942-uhd_4096_2160_24fps.mp4 -c:v h264_videotoolbox -b:v 12000k 1390942-uhd_4096_2160_24fps_after.mp4 -loglevel debug
源文件的大小是78M,A版本ffmpeg压缩后的文件是39.6M,B版本压缩后是112M,这个奇怪的现象有可能是什么原因呢?

考虑是编译选项的问题,但没有看出有可能的原因,希望有经验的专家帮忙鉴定一下:
2个ffmpeg的编译选项:
A:
ffmpeg version 7.1 Copyright (c) 2000-2024 the FFmpeg developers
built with Apple clang version 15.0.0 (clang-1500.3.9.4)
configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/7.1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon
libavutil 59. 39.100 / 59. 39.100
libavcodec 61. 19.100 / 61. 19.100
libavformat 61. 7.100 / 61. 7.100
libavdevice 61. 3.100 / 61. 3.100
libavfilter 10. 4.100 / 10. 4.100
libswscale 8. 3.100 / 8. 3.100
libswresample 5. 3.100 / 5. 3.100
libpostproc 58. 3.100 / 58. 3.100

B:
ffmpeg version 7.0.1 Copyright (c) 2000-2024 the FFmpeg developers
built with Apple clang version 15.0.0 (clang-1500.3.9.4)
configuration: --prefix=/Users/mac/code/baidu/transcode/third_party/ffmpeg701/ffmpeg_build_macos/mac_x86_64 --disable-debug --target-os=darwin --arch=x86_64 --cc='clang -arch x86_64' --enable-cross-compile --ranlib=/usr/bin/ranlib --strip=/usr/bin/strip --extra-cflags='-std=c11 -I/Users/mac/code/baidu/transcode/third_party/ffmpeg701/ffmpeg_build_macos/mac_x86_64/include -I/Users/mac/code/baidu/transcode/third_party/ffmpeg701/ffmpeg_build_macos/mac_x86_64/include/fdk-aac' --extra-cxxflags='-std=c++11' --extra-ldflags=-L/Users/mac/code/baidu/transcode/third_party/ffmpeg701/ffmpeg_build_macos/mac_x86_64/lib --extra-libs='-lpthread -lm -lc++' --host-cflags= --host-ldflags= --enable-static --enable-avformat --disable-decoders --enable-decoder=h264 --enable-decoder=hevc --enable-decoder=aac --disable-shared --disable-alsa --disable-doc --disable-openssl --disable-libvpx --disable-libwebp --disable-lzma --disable-bzlib --disable-xlib --disable-libxcb --disable-vaapi --disable-sndio --disable-librtmp --enable-gpl --enable-nonfree --enable-libx264 --enable-encoder=libx264 --enable-libfdk-aac --enable-encoder=h264_videotoolbox --enable-videotoolbox --disable-libmp3lame --disable-asm --disable-zlib --disable-audiotoolbox
libavutil 59. 8.100 / 59. 8.100
libavcodec 61. 3.100 / 61. 3.100
libavformat 61. 1.100 / 61. 1.100
libavdevice 61. 1.100 / 61. 1.100
libavfilter 10. 1.100 / 10. 1.100
libswscale 8. 1.100 / 8. 1.100
libswresample 5. 1.100 / 5. 1.100
libpostproc 58. 1.100 / 58. 1.100

共有1个答案

朱博实
2024-11-12

可能的原因

在对比两个版本的 FFmpeg(A 版本和 B 版本)时,尽管它们声称都是基于相同的版本号(7.0.1),但在编译选项和配置上的差异可能会导致显著的压缩比不同。以下是一些可能的解释:

  1. 架构和编译目标不同

    • A 版本是为 arm64 架构编译的,这通常用于现代 Mac 设备(如 M1 和 M2 芯片)。
    • B 版本是为 x86_64 架构编译的,这适用于旧款 Intel 和 AMD 芯片的 Mac 设备。

    不同架构可能会影响硬件加速(如 VideoToolbox)的性能和效率,从而导致不同的压缩结果。

  2. 编译选项和启用/禁用的库

    • A 版本启用了更多的库和特性,如 --enable-gpl, --enable-libaom, --enable-libdav1d 等,这些虽然与 VideoToolbox 编码不直接相关,但可能影响整体性能和配置。
    • B 版本特别针对 VideoToolbox 编码进行了配置(--enable-encoder=h264_videotoolbox --enable-videotoolbox),并且禁用了很多其他库和特性,如 --disable-libvpx, --disable-libwebp 等。

    这种差异可能导致 VideoToolbox 在不同版本的 FFmpeg 中以不同的方式工作。

  3. FFmpeg 内部版本和库的差异

    • 尽管两个版本的 FFmpeg 都声称是 7.0.1,但内部使用的库版本(如 libavutil, libavcodec 等)可能存在细微差异。
    • A 版本可能使用了更新的库版本,这些版本可能包含性能改进或错误修复。
  4. 硬件和驱动程序的差异

    • 不同版本的 FFmpeg 可能对硬件加速的支持程度不同,特别是在不同架构的 Mac 设备上。
    • 驱动程序和操作系统的更新也可能影响硬件加速的性能。

建议的解决步骤

  1. 确保架构一致性

    • 如果可能,尝试在相同的架构上编译和使用 FFmpeg,以排除架构差异的影响。
  2. 检查 FFmpeg 日志

    • 仔细检查两个版本的 FFmpeg 的调试日志,查找与 VideoToolbox 编码相关的任何警告或错误。
  3. 更新和重新编译

    • 尝试使用最新的 FFmpeg 源代码重新编译两个版本,并确保使用相同的编译选项。
  4. 使用其他工具进行验证

    • 使用其他视频编码工具(如 HandBrake)进行相同的压缩任务,以验证是否是 FFmpeg 特定的问题。
  5. 联系 FFmpeg 社区

    • 如果问题仍然存在,考虑向 FFmpeg 社区或相关论坛寻求帮助,可能有其他用户遇到了类似的问题。
 类似资料:
  • 我在spark中有一个操作,应该对数据帧中的几列执行。通常,有两种可能来指定这样的操作 hardcode 从colnames列表动态生成它们

  • 问题内容: 我们将更新创建从Java 7到Java 8的构建的CI系统。稍后,我们希望将项目一个接一个地迁移到Java 8。当然,我们希望能够为仍使用Java 7的旧版本创建错误修正版本。 如果我们将构建相同的源,目标版本和源版本从JDK 7转移到JDK 8,我们是否可以确定不会出现任何问题?我们在开发机器上进行了测试,没有任何问题。 在此之前,我们还将逐步将部署服务器从JRE 7更新到JRE 8

  • 有什么建议吗? 这对btw-helm没有帮助:错误:找不到可用的发行版名称

  • 这样写 判断不了只读属性和不是只读属性 有什么办法吗(这是为什么T_T)

  • 问题内容: Java文档说“同一对象上的同步方法的两次调用不可能交错”。我需要知道的是,synchronized是否还会阻止 同一类的 两个不同 实例中的 同步方法交织。 例如,类Worker具有称为process()的方法。我们有几个在自己的线程中运行的Worker实例。我们希望防止多个实例同时运行process()方法。会 同步 吗? 谢谢。 问题答案: 没有; 仅防止多个线程在 同一 实例中

  • 我试图解决这个问题:https://leetcode.com/problems/palindrome-number/使用代码: 并在C中得到了这个错误: 但同样的代码在Java中运行得很好。为什么会这样?我该如何修复它?

  • 本文向大家介绍浅谈针对Vue相同路由不同参数的刷新问题,包括了浅谈针对Vue相同路由不同参数的刷新问题的使用技巧和注意事项,需要的朋友参考一下 在使用vue和vue-router开发spa应用时,我们会遇到这样一种问题。 当页面跳转时,组件本身并没有发生改变: 这时我们进行路由跳转后会发现组件并没有刷新,在前一个路由组件的数据都保留了下来,这并不是我们想要的效果。 对于简单的数据更新,我们可以直接

  • 这个问题最好用一个示例日期来解释,例如datetime now(伦敦时间):21/08/2020 11:34 am 我对“ET”和UTC格式以及ISO格式的时间感到困惑,EDT和ET是一样的吗?为什么有这么多不同的格式,而且它们很混乱。有人能用一种简单的方式解释一下吗?除非我没有找到正确的文档,否则网上的信息不是很容易理解。 我希望将ET转换为UTC的原因是AWS cron作业仅采用此格式(如果我