AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1425350
Accepted
Hashim Aziz
Hashim Aziz
Asked: 2019-04-15 08:29:27 +0800 CST2019-04-15 08:29:27 +0800 CST 2019-04-15 08:29:27 +0800 CST

如何为 Windows 编译最佳版本的 FFmpeg

  • 772

人们普遍认为,由于许可原因,FFmpeg 的预编译 Windows 可执行文件开箱即用,带有较低质量的编码器 - 特别是当涉及到默认 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,我宁愿用它来编译程序,也不愿设置另一个软件生态系统或刻录整个 Linux 发行版。

我如何使用 Cygwin 来编译带有更好外部库的 FFmpeg?

ffmpeg cygwin compile
  • 2 2 个回答
  • 17452 Views

2 个回答

  • Voted
  1. Best Answer
    Hashim Aziz
    2019-04-15T08:29:27+08:002019-04-15T08:29:27+08:00

    这说起来容易做起来难,我花了一个多月的时间才弄清楚如何做到没有任何问题,但我花了足够多的时间在这上面,所以我决定把这个过程记录得足够好,以便几乎无缝地完成任何人跟着我。

    不幸的是,Cygwin 的默认工具链(即gcc-core包含在 Cygwin 安装程序中的包)对于交叉编译目的来说是固有的破坏,并且 Cygwin 维护者似乎没有任何修复这个问题的意图,所以目前,唯一的编译方法Windows with Cygwin的软件是在其下建立一个MinGW-w64工具链。值得庆幸的是,这就像安装几个软件包一样简单。在此之后,我们将编译剩余的包,然后再使用两者的组合来编译 FFmpeg 本身。

    使用本指南

    完整地遵循本指南将构建一个静态 FFmpeg 安装,其中包含外部库, 例如fdk-aac,和 SOX 重采样器。如果我收到足够多的针对特定库的请求,我可能会考虑在指南中添加有关编译特定外部库的说明。libopusx265

    本指南使用的依赖项 - 由 MinGW-w64 交叉编译工具链本身、安装的apt-cyg所有包和从源代码编译的所有包组成 - 将占用高达 2.8GB 的​​磁盘空间,尽管本指南还包括清理命令除了 FFmpeg 安装之外的所有内容都已完成。安装本身由二进制文件和文档组成,仅占用超过 200MB 的磁盘空间。

    本指南将在您的主目录中创建一个名为 的文件夹,ffmpeg_sources它将在其中下载并编译所有从源代码构建的包。FFmpeg会安装到/usr/local,FHS标准建议安装用户自己编译的软件。此位置还有一个次要优势,即PATH在 Cygwin 中默认位于系统上,因此不需要$PATH更新环境变量。

    安装包管理器依赖项

    首先,下载最新版本的Cygwin安装程序以安装wget、tar和包。好消息是这些包是一个工具的依赖项,可以防止您再次使用 Cygwin 安装程序。gawkgit

    安装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 
    

    libx264

    要编译 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 
    

    libsoxr

    要编译 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 
    

    这将删除本指南过程中安装的所有内容,并将您的系统恢复到启动前的状态。

    • 12
  2. slhck
    2019-12-27T08:21:29+08:002019-12-27T08:21:29+08:00

    Instead of doing everything manually, you can use the media-autobuild_suite for Windows, which builds FFmpeg with almost all of its dependencies:

    This Windows Batchscript setups a MinGW/GCC compiler environment for building ffmpeg and other media tools under Windows. After building the environment it retrieves and compiles all tools. All tools get static compiled, no external .dlls needed (with some optional exceptions)

    The script gets continuously updated, and for most users, it will be the preferred way to get FFmpeg compiled under Windows.

    • 3

相关问题

  • -map_metadata 抓取多个音频流元数据

  • 最低比特率 ffmpeg 输出的编解码器和设置

  • 如何用ffmpeg 2.0.2保存TS视频流?

  • 快速提取 I 帧到图像

  • 压缩视频可以解码回未压缩的原始格式吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    Windows 10 服务称为 AarSvc_70f961。它是什么,我该如何禁用它?

    • 2 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Marko Smith

    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1056)

    • 4 个回答
  • Marko Smith

    我如何知道 Windows 安装在哪个驱动器上?

    • 6 个回答
  • Martin Hope
    Albin 支持结束后如何激活 WindowsXP? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch Windows 10 删除大量小文件的速度非常慢。有什么办法可以加快速度吗? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Ctrl+C 和 Ctrl+V 是如何工作的? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve