⚠️ 这是一个非官方翻译网站,与 FFmpeg 项目无关。准确信息请参阅原文(https://ffmpeg.org/platform.html)

特定平台信息

1 类 Unix 系统

FFmpeg 的部分代码无法用一些 AMD64 发行版仍在提供的 2.15 版 GNU 汇编器构建。要确认升级 binutils 后编译器确实使用了所需版本的 gas,请运行:

$(gcc -print-prog-name=as) --version

如果版本不对,应安装一个不硬编码 gas 路径的其他编译器。最坏情况下,可以向 configure 传入 --disable-asm

1.1 高级链接配置

如果你静态编译了 FFmpeg 的库,并想用它们构建自己的共享库,可能需要强制启用 PIC 支持(在 FFmpeg configure 时加上 --enable-pic),并在项目的 LDFLAGS 中添加以下选项:

-Wl,-Bsymbolic

如果目标平台要求位置无关的可执行文件,应向 --extra-ldexeflags 传入正确的链接标志(例如 -pie)。

1.2 BSD

BSD 自带的 make 无法构建 FFmpeg,你需要安装并使用 GNU Make(gmake)。

1.3 (Open)Solaris

构建 FFmpeg 需要 GNU Make,因此要调用(gmake),标准的 Solaris Make 无法使用。用非 c99 前端(gcc 或一般的 suncc)构建时,由于 libc 默认不符合 c99,需要在 configure 选项中加上 --extra-libs=/usr/lib/values-xpg6.o--extra-libs=/usr/lib/64/values-xpg6.o 之一。configure 执行的探测可能会因系统 shell 的一个缺陷而抛出异常,导致 configure 本身异常终止。直接调用 bash 等其他 shell 即可规避这个问题:

bash ./configure

1.4 Darwin(Mac OS X、iPhone)

Xcode 自带的工具链足以构建基本的无加速代码。

PowerPC 或 ARM(iPhone)上的 Mac OS X 需要来自 https://github.com/FFmpeg/gas-preprocessorhttps://github.com/yuvi/gas-preprocessor(目前已过时)的预处理器,才能构建经过优化的汇编函数。把这个 Perl 脚本放到 PATH 中的某处,FFmpeg 的 configure 就会自动找到它。

amd64 和 x86 上的 Mac OS X 需要 nasm 来构建大部分经过优化的汇编函数。FinkGentoo PrefixHomebrewMacPorts 都可以轻松提供它。

2 DOS

出于各种原因,推荐使用交叉编译器。http://www.delorie.com/howto/djgpp/linux-x-djgpp.html

3 OS/2

关于在 OS/2 上编译 FFmpeg 的信息,请参阅 http://www.edm2.com/index.php/FFmpeg

4 Windows

4.1 使用 MinGW 或 MinGW-w64 进行 Windows 原生编译

FFmpeg 可以使用 MinGW-w64 工具链构建,从而在 Windows 上原生运行。从 http://msys2.github.io/ 和/或 http://mingw-w64.sourceforge.net/ 安装最新版本的 MSYS2 和 MinGW-w64。详细的安装说明可以在下载区和 FAQ 中找到。

注意事项:

  • 不建议为 MSYS 环境构建,MSYS2 通过 mingw64_shell.bat 或 mingw32_shell.bat 提供了完整的 MinGW-w64 环境,应使用它们而不是 msys2_shell.bat 提供的环境。
  • 使用 MSYS2 构建时,可以通过调用 make -r 而不是普通的 make 来禁用 Makefile 中的隐式规则,从而加快速度。这种加速对于普通的一次性构建几乎没有效果,只有第二次运行 make 时(例如执行 make install 时)才会比较明显。
  • 要编译 FFplay,你必须安装 SDL 的 MinGW 开发库以及 pkg-config
  • 在配置 FFmpeg 时使用 ./configure --enable-shared,就可以把 FFmpeg 的库(例如 libavutil、libavcodec、libavformat)构建为 DLL。

4.1.1 使用 MSYS2 进行 Windows 原生编译

MSYS2 的 MinGW-w64 环境通过 pacman 提供了开箱即用的工具链和依赖。

请务必使用 mingw64_shell.bat 或 mingw32_shell.bat,以获得正确的 MinGW-w64 环境。默认安装会在 MinGW-w64 Win64 ShellMinGW-w64 Win32 Shell 下提供指向它们的快捷方式。

# normal msys2 packages
pacman -S make pkgconf diffutils

# mingw-w64 packages and toolchains
pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2

要面向 32 位,把上面命令中的 x86_64 替换为 i686

4.2 面向 Windows 的 Microsoft Visual C++ 或 Intel C++ Compiler

FFmpeg 可以用 MSVC 2013 或更高版本构建。

你需要以下前提条件:

  • MSYS2
  • NASM(也可以通过 MSYS2 的包管理器获取。)

要在 MSYS2 中搭建合适的环境,需要从 Visual Studio 或 Intel Compiler 的命令提示符中运行 msys_shell.bat

nasm.exe 放到 PATH 中的某处。

接下来,确保你想使用的其他头文件和库(例如 zlib)都位于编译器可见的位置。为此,可以修改 LIBINCLUDE 环境变量,加入指向这些目录的 Windows 风格 路径。另外,也可以尝试使用 --extra-cflags/--extra-ldflags 这两个 configure 选项。

最后,运行:

For MSVC:
./configure --toolchain=msvc

For ICL:
./configure --toolchain=icl

make
make install

如果你想编译共享库,请在 configure 选项中加上 --enable-shared。请注意,由于 MSVC 和 ICL 处理 DLL 导入/导出的方式,你无法同时编译静态库和共享库,启用共享库会自动禁用静态库。

注意事项:

  • 如果你想构建带 zlib 支持的 FFmpeg,需要从某处获取一个兼容的 zlib 二进制文件(附带 MSVC 导入库),或者如果你想静态链接,可以按照下面的说明用 MSVC 构建一个兼容的 zlib.lib。无论使用哪种方法,都仍然必须执行步骤 3,否则编译会失败。
    1. 获取 zlib 源码
    2. 编辑 win32/Makefile.msc,使其使用 -MT 而不是 -MD,因为 FFmpeg 也是这样构建的。
    3. 编辑 zconf.h,移除其中对 unistd.h 的引入。构建 FFmpeg 时会错误地引入这个头文件。
    4. 运行 nmake -f win32/Makefile.msc
    5. zlib.libzconf.hzlib.h 移动到 MSVC 可见的位置。
  • FFmpeg 已在 i686 和 x86_64 上使用以下环境测试过:
    • Visual Studio 2013 Pro and Express
    • Intel Composer XE 2013
    • Intel Composer XE 2013 SP1

其他情况不受官方支持。

4.2.1 用 Microsoft Visual C++ 链接 FFmpeg

如果你打算链接 MSVC 构建的静态库,需要确保项目设置中的 Runtime Library 设为 Multi-threaded (/MT)

你需要把 inline 定义成 MSVC 能理解的形式:

#define inline __inline

另外请注意,正如 Microsoft Visual C++ 一节所述,你还需要一个与 MSVC 兼容的 inttypes.h

如果你打算使用 dlltool 创建的导入库,必须在链接器的优化设置中将 References 设为 No (/OPT:NOREF),否则生成的二进制文件在运行时会失败。使用 lib.exe 生成的导入库则不需要这样做。这个问题已在上游报告,见 http://sourceware.org/bugzilla/show_bug.cgi?id=12633

要创建能配合 /OPT:REF 选项(Release 模式下默认启用)工作的导入库,请按以下步骤操作:

  1. 打开 Visual Studio 命令提示符

或者,在普通的命令行提示符中调用 vcvars32.bat,即可设置 Visual C++ 工具所需的环境变量(这个文件的标准位置类似 C:\Program Files (x86_\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat)。

  1. 进入存放生成的 LIB 和 DLL 文件的 bin 目录。
  2. lib.exe 生成新的导入库:
     lib /machine:i386 /def:..\lib\foo-version.def  /out:foo.lib
    

foo-versionfoo 替换成对应的库名。

4.3 在 Linux 下为 Windows 交叉编译

你必须使用 http://www.mingw.org/ 提供的 MinGW 交叉编译工具。

然后用以下选项配置 FFmpeg:

./configure --target-os=mingw32 --cross-prefix=i386-mingw32msvc-

(你可以根据为 MinGW 工具选择的前缀来更改 cross-prefix)。

之后就可以用 Wine 轻松测试 FFmpeg。

4.4 在 Cygwin 下编译

请使用 Cygwin 1.7.x,因为过时的 1.5.x 版 Cygwin 的 C 库缺少 llrint()。

安装 Cygwin 时选上所有的“Base”软件包,再加上以下“Devel”软件包:

binutils, gcc4-core, make, git, mingw-runtime, texinfo

要运行 FATE,还需要以下“Utils”软件包:

diffutils

如果你想用附加库构建 FFmpeg,请从任意 Cygwin 软件包仓库下载 Ogg 和 Vorbis 的 Cygwin“Devel”软件包:

libogg-devel, libvorbis-devel

以下库软件包只能从 Cygwin Ports 获取:

libSDL-devel, libgsm-devel, libmp3lame-devel,
speex-devel, libtheora-devel, libxvidcore-devel

对于 x264,建议从源码构建,因为它的更新速度太快,Cygwin Ports 跟不上。

4.5 在 Cygwin 下为 Windows 交叉编译

使用 Cygwin,你可以创建不需要 cygwin1.dll 的 Windows 二进制文件。

按前面所述安装 Cygwin,再加上以下额外的“Devel”软件包:

gcc-mingw-core, mingw-runtime, mingw-zlib

并在 configure 调用中加入一些特殊标志。

进行静态构建时运行

./configure --target-os=mingw32 --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin

进行带共享库的构建时运行

./configure --target-os=mingw32 --enable-shared --disable-static --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin

4.6 ARM64EC

FFmpeg 不打算支持 Windows 的 ARM64EC 构建配置;为 ARM64EC 目的而修改各个库的补丁不会被接受。

在这种构建配置下构建 FFmpeg 仍有可能是可行的;这样的构建看起来在某种程度上可以工作。不过这样的构建可能存在一定程度的 ABI 不一致,我们不打算修复这些问题。

(要让 aarch64 汇编代码严格支持 ARM64EC,需要对几乎所有此类汇编代码做条件编译或改动,这将带来巨大的维护负担。此外,为修复 ABI 不一致而改动库的 ABI 边界,可能需要广泛而侵入性的改动。)

主机托管由 telepoint.bg 提供