它是大致接受默认情况下,FFmpeg 附带的编码器质量较低 - 尤其是当涉及到默认 AAC 编码器和默认重采样器。
根据这些来源,解决方案是从源代码编译程序:
FFmpeg 支持两个 AAC-LC 编码器(aac 和 libfdk_aac)和一个 HE-AAC (v1/2) 编码器(libfdk_aac)。libfdk_aac 的许可证与 GPL 不兼容,因此当 GPL 许可代码也包含在内时,GPL 不允许分发包含不兼容代码的二进制文件。因此,此编码器已被指定为“非免费”,您无法下载支持它的预构建 ffmpeg。这个问题可以通过自己编译ffmpeg来解决...
Fraunhofer FDK AAC 编解码器库。这是目前 ffmpeg 中质量最高的 AAC 编码器。需要使用 --enable-libfdk-aac 配置 ffmpeg(如果您还使用 --enable-gpl,则另外还要使用 --enable-nonfree)。
...
如果你想要 FDK-AAC你必须自己编译 handbrake。我做到了,现在音频听起来很棒。
如何在 Cygwin/Windows 上使用更好的外部库编译 FFmpeg?
答案1
这说起来容易做起来难,我花了一个多月的时间才弄清楚如何顺利地做到这一点,但是我已经花了足够多的时间,所以我决定将这个过程记录下来,以便任何跟随我的人都可以几乎无缝地完成。
不幸的是,Cygwin 的默认工具链(即gcc-core
Cygwin 安装程序中包含的软件包)在交叉编译方面存在固有缺陷,而且 Cygwin 维护人员似乎无意修复此问题,因此目前,使用 Cygwin 编译 Windows 软件的唯一方法是在其下设置 MinGW-w64 工具链。幸运的是,这就像安装几个软件包一样简单。在此之后,我们将编译剩余的软件包,然后结合使用两者来编译 FFmpeg 本身。
使用本指南
按照本指南操作,您将构建一个静态 FFmpeg 安装,其中包含外部库(例如fdk-aac
、libopus
和 x265
SOX 重采样器)。我可能会考虑在指南中添加编译特定外部库的说明如果我收到了足够多的针对特定图书馆的请求。
本指南使用的依赖项(由 MinGW-w64 交叉编译工具链本身、安装的所有软件包apt-cyg
以及从源代码编译的所有软件包组成)将占用高达 2.8GB 的磁盘空间,尽管本指南还包含命令,用于在安装完成后清理除 FFmpeg 之外的所有内容。安装本身由二进制文件和文档组成,占用的磁盘空间刚好超过 200MB。
本指南将在您的主目录中创建一个名为的文件夹ffmpeg_sources
,它将在其中下载并编译从源代码构建的所有软件包。FFmpeg 将安装到/usr/local
,其中 FHS 标准建议用户编译的软件安装到的位置。此位置还有一个次要优势,即PATH
在 Cygwin 中默认位于系统上,因此不需要$PATH
更新环境变量。
安装包管理器依赖项
首先,下载最新版本的Cygwin 安装程序安装wget
、tar
和包。好消息是,这些包是某个工具的依赖项,这样您就再也不需要使用 Cygwin 安装程序了gawk
。git
安装apt-cyg
包管理器
接下来,安装kou1okada 的 apt-cyg 包管理器分支。如果您目前没有使用 Cygwin 的包管理器,这一步不仅可以让本指南的其余部分变得轻而易举,而且还可以让您的 Cygwin 体验与任何 Linux 发行版相媲美。
即使您已在使用 Cygwin 的包管理器,比如原始包管理器的不同分支apt-cyg
,我也强烈建议您用这个包管理器替换它,这个包管理器比原始包管理器功能更加完善,也是唯一一个正在积极开发的 Cygwin 包管理器。
要安装 kou1okada apt-cyg
:
mkdir -p /usr/local/src &&
cd /usr/local/src &&
git clone https://github.com/kou1okada/apt-cyg.git &&
ln -s "$(realpath apt-cyg/apt-cyg)" /usr/local/bin/
安装构建工具并设置 MinGW-w64 交叉编译器
apt-cyg install \
autoconf \
automake \
binutils \
cmake \
doxygen \
git \
libtool \
make \
mercurial \
mingw64-x86_64-SDL2 \
mingw64-x86_64-binutils \
mingw64-x86_64-fribidi \
mingw64-x86_64-gcc-core \
mingw64-x86_64-gcc-g++ \
mingw64-x86_64-headers \
mingw64-x86_64-libtheora \
mingw64-x86_64-libvpx \
mingw64-x86_64-runtime \
mingw64-x86_64-win-iconv \
mingw64-x86_64-windows-default-manifest \
mingw64-x86_64-zlib \
nasm \
pkg-config \
subversion \
texinfo \
yasm
编译依赖项
下面的每个部分都编译了一个外部库,可让您编译启用了该库支持的 FFmpeg。将每个命令的全部内容复制并粘贴到您的 shell 中。
如果您决定不需要构建 FFmpeg 来支持给定的库,请在本指南的最后阶段编译 FFmpeg 时跳过其部分并删除相应的行。--enable-package
在 Cygwin 安装的根目录下创建一个目录,内容如下:
rm -rf /ffmpeg_sources &&
mkdir -p /ffmpeg_sources
这是我们将下载源代码并从中进行编译的目录。
libmp3lame
要编译 MP3 的 LAME 音频编解码器:
cd /ffmpeg_sources && rm -rf lame-svn &&
svn checkout https://svn.code.sf.net/p/lame/svn/trunk/lame lame-svn &&
cd lame-svn &&
./configure --host=x86_64-w64-mingw32 --prefix="/usr/x86_64-w64-mingw32/sys-root/mingw" \
--enable-static --disable-shared &&
make -j$(nproc) &&
make install
库文件
要编译 x264 视频编解码器:
cd /ffmpeg_sources && rm -rf x264 &&
git clone --depth 1 https://code.videolan.org/videolan/x264.git &&
cd x264 &&
./configure --cross-prefix=x86_64-w64-mingw32- --host=x86_64-w64-mingw32 \
--prefix="/usr/x86_64-w64-mingw32/sys-root/mingw" --enable-static &&
make -j$(nproc) &&
make install
libx265
要编译 x265 视频编解码器:
cd /ffmpeg_sources && rm -rf x265 &&
hg clone https://bitbucket.org/multicoreware/x265 &&
cd x265/build/linux &&
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="/usr/x86_64-w64-mingw32/sys-root/mingw" \
-DENABLE_SHARED=OFF -DCMAKE_EXE_LINKER_FLAGS="-static" ../../source \
-DCMAKE_TOOLCHAIN_FILE="/ffmpeg_sources/x265/build/msys/toolchain-x86_64-w64-mingw32.cmake" &&
make -j$(nproc) &&
make install
libogg/libvorbis
Ogg 格式是 Vorbis 音频编解码器的依赖项,因此需要在它之前进行编译:
cd /ffmpeg_sources && rm -rf ogg &&
git clone --depth 1 https://gitlab.xiph.org/xiph/ogg.git &&
cd ogg && ./autogen.sh &&
./configure --host=x86_64-w64-mingw32 --prefix="/usr/x86_64-w64-mingw32/sys-root/mingw" \
--enable-static --disable-shared &&
make -j$(nproc) &&
make install
然后正常编译 Vorbis:
cd /ffmpeg_sources && rm -rf vorbis &&
git clone --depth 1 https://gitlab.xiph.org/xiph/vorbis.git &&
cd vorbis && ./autogen.sh &&
./configure --host=x86_64-w64-mingw32 --prefix="/usr/x86_64-w64-mingw32/sys-root/mingw" \
--enable-static --disable-shared &&
make -j$(nproc) &&
make install
利宝姆
要编译 AV1 视频编码器:
cd /ffmpeg_sources && rm -rf aom &&
git clone --depth 1 https://aomedia.googlesource.com/aom &&
mkdir -p /ffmpeg_sources/aom/build && cd /ffmpeg_sources/aom/build &&
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="/usr/x86_64-w64-mingw32/sys-root/mingw" \
-DCMAKE_EXE_LINKER_FLAGS="-static" .. \
-DCMAKE_TOOLCHAIN_FILE="/ffmpeg_sources/aom/build/cmake/toolchains/x86_64-mingw-gcc.cmake" &&
make -j$(nproc) &&
make install
利巴普斯
要编译 Opus 音频编码器:
cd /ffmpeg_sources && rm -rf opus &&
git clone --depth 1 https://github.com/xiph/opus.git &&
cd opus && ./autogen.sh &&
./configure CFLAGS="-I/usr/local/llsp" --host=x86_64-w64-mingw32 --prefix="/usr/x86_64-w64-mingw32/sys-root/mingw" \
--enable-static --disable-shared &&
make -j$(nproc) &&
make install
libfdk-aac
要编译用于 AAC 的 Fraunhofer FDK 编码器:
cd /ffmpeg_sources && rm -rf fdk-aac &&
git clone --depth 1 https://github.com/mstorsjo/fdk-aac &&
cd fdk-aac && autoreconf -fiv &&
./configure --host=x86_64-w64-mingw32 --prefix="/usr/x86_64-w64-mingw32/sys-root/mingw" \
--enable-static --disable-shared &&
make -j$(nproc) &&
make install
库
要编译 SOX 重采样器库,您首先需要为 MinGW-w64 工具链创建一个 CMAKE 工具链文件,因为该项目默认不包含该文件。
在 Cygwin 根目录中创建一个新文件并调用它toolchain-x86_64-mingw32.cmake
(确保 Windows 显示扩展名,并且扩展名是.cmake
)。
将以下内容复制并粘贴到文件中:
SET(CMAKE_SYSTEM_NAME Windows)
SET(CMAKE_C_COMPILER /usr/bin/x86_64-w64-mingw32-gcc)
SET(CMAKE_CXX_COMPILER /usr/bin/x86_64-w64-mingw32-g++)
SET(CMAKE_RC_COMPILER /usr/bin/x86_64-w64-mingw32-windres)
SET(CMAKE_Fortran_COMPILER /usr/bin/x86_64-w64-mingw32-gfortran)
SET(CMAKE_AR:FILEPATH /usr/bin/x86_64-w64-mingw32-ar)
SET(CMAKE_RANLIB:FILEPATH /usr/bin/x86_64-w64-mingw32-ranlib)
SET(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(QT_BINARY_DIR /usr/x86_64-w64-mingw32/bin /usr/bin)
SET(Boost_COMPILER -gcc47)
现在您可以正常编译 SOX 重采样器:
cd /ffmpeg_sources && rm -rf soxr &&
git clone --depth 1 https://git.code.sf.net/p/soxr/code soxr &&
mkdir -p soxr/build && cd soxr/build &&
cmake -Wno-dev -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="/usr/x86_64-w64-mingw32/sys-root/mingw" \
-DBUILD_SHARED_LIBS=OFF .. -DCMAKE_TOOLCHAIN_FILE="/toolchain-x86_64-mingw32.cmake" &&
make -j$(nproc) &&
make install
编译 FFmpeg 二进制文件
剩下唯一要做的事情就是使用上面下载或编译的库来编译 FFmpeg 本身:
cd /ffmpeg_sources && rm -rf ffmpeg &&
wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 &&
tar xvf ffmpeg-snapshot.tar.bz2 && rm -f ffmpeg-snapshot.tar.bz2 && cd ffmpeg &&
CFLAGS=-I/usr/x86_64-w64-mingw32/sys-root/mingw/include &&
LDFLAGS=-L/usr/x86_64-w64-mingw32/sys-root/mingw/lib &&
export PKG_CONFIG_PATH= &&
export PKG_CONFIG_LIBDIR=/usr/x86_64-w64-mingw32/sys-root/mingw/lib/pkgconfig &&
./configure \
--arch=x86_64 \
--target-os=mingw32 \
--cross-prefix=x86_64-w64-mingw32- \
--prefix=/usr/local \
--pkg-config=pkg-config \
--pkg-config-flags=--static \
--extra-cflags=-static \
--extra-ldflags=-static \
--extra-libs="-lm -lz -fopenmp" \
--enable-static \
--disable-shared \
--enable-nonfree \
--enable-gpl \
--enable-avisynth \
--enable-libaom \
--enable-libfdk-aac \
--enable-libfribidi \
--enable-libmp3lame \
--enable-libopus \
--enable-libsoxr \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 &&
make -j$(nproc) &&
make install
请记住删除--enable-\*package\*
上面列表中的每个您没有下载或编译库的包的行。
编译 FFmpeg 所需的时间比编译外部库要长得多,但一旦完成,您就会得到一个完全可用的二进制文件,其中包含编译它时使用的所有库。要运行它,只需ffmpeg
在 Cygwin 终端中运行即可。
清理/卸载
到本指南的这一步,下载、安装和编译将占用大约 2.8 GB 的磁盘空间。其中大部分现在是多余的,应该清理掉。其中超过 2.6 GB 的空间可以安全清除,这样我们的 FFmpeg 安装的总占用空间将减少到只有 200MB。
安装后清理
运行以下命令将释放超过 2.3GB 的磁盘空间:
apt-cyg remove \
cmake \
doxygen \
git \
mercurial \
subversion \
texinfo \
yasm &&
rm -rf /ffmpeg_sources &&
rm -rf /usr/local/lib/{libav*,libpost*,libsw*} &&
rm -rf /usr/local/lib/pkgconfig/{libav*,libpost*,libsw*} &&
rm -rf /usr/local/include/{libav*,libpost*,libsw*} &&
rm -rf /toolchain-x86_64-mingw32.cmake
除了删除ffmpeg_sources
目录和不需要的静态库之外,这还将删除之前安装的不再需要的所有软件包,除了对于那些在 Cygwin/Linux 上构建工具通常需要的那些。
删除交叉编译器
如果您不再打算使用本指南前面构建的 MinGW-w64 交叉编译工具链编译任何其他程序,您可以安全地卸载它,以及之前安装的所有剩余软件包:
apt-cyg remove \
autotools \
autoconf \
automake \
gcc-core \
gcc-g++ \
pkg-config \
libtool \
make \
nasm \
mingw64-x86_64-SDL2 \
mingw64-x86_64-binutils \
mingw64-x86_64-fribidi \
mingw64-x86_64-gcc-core \
mingw64-x86_64-gcc-g++ \
mingw64-x86_64-headers \
mingw64-x86_64-libtheora \
mingw64-x86_64-libvpx \
mingw64-x86_64-runtime \
mingw64-x86_64-win-iconv \
mingw64-x86_64-windows-default-manifest \
mingw64-x86_64-zlib &&
rm -rf /usr/x86_64-w64-mingw32
这将释放额外的约 450 MB 的空间。
卸载 FFmpeg
如果您需要撤销本指南中的所有步骤并从系统中清除 FFmpeg 二进制文件,只需运行以下命令:
apt-cyg remove \
autotools \
autoconf \
automake \
binutils \
cmake \
doxygen \
gcc-core \
gcc-g++ \
git \
libtool \
make \
mercurial \
mingw64-x86_64-SDL2 \
mingw64-x86_64-binutils \
mingw64-x86_64-fribidi \
mingw64-x86_64-gcc-core \
mingw64-x86_64-gcc-g++ \
mingw64-x86_64-headers \
mingw64-x86_64-libtheora \
mingw64-x86_64-libvpx \
mingw64-x86_64-runtime \
mingw64-x86_64-win-iconv \
mingw64-x86_64-windows-default-manifest \
mingw64-x86_64-zlib \
nasm \
pkg-config \
subversion \
texinfo \
yasm &&
rm -rf /ffmpeg_sources &&
rm -rf /usr/local/bin{ffmpeg,ffprobe,ffplay} &&
rm -rf /usr/local/lib/{libav*,libpost*,libsw*} &&
rm -rf /usr/local/lib/pkgconfig/{libav*,libpost*,libsw*} &&
rm -rf /usr/local/include/{libav*,libpost*,libsw*} &&
rm -rf /usr/local/share/doc/ffmpeg &&
rm -rf /usr/local/share/ffmpeg &&
rm -rf /usr/local/share/man/man1/ff* &&
rm -rf /usr/local/share/man/man3/{libav*,libpost*,libsw*} &&
rm -rf /usr/x86_64-w64-mingw32/ &&
rm -rf /toolchain-x86_64-mingw32.cmake
这将删除本指南过程中安装的所有内容,并将系统恢复到启动之前的状态。
答案2
您无需手动完成所有操作,而是可以使用media-autobuild_suite
对于 Windows,它构建了 FFmpeg 及其几乎所有依赖项:
此 Windows Batchscript 设置了一个 MinGW/GCC 编译器环境,用于在 Windows 下构建 ffmpeg 和其他媒体工具。构建环境后,它会检索并编译所有工具。所有工具都经过静态编译,无需外部 .dll(有一些可选例外)
该脚本不断更新,对于大多数用户来说,它将是 Windows 下编译 FFmpeg 的首选方式。