目录
[四、Linux 构建](#四、Linux 构建)
[五、macOS 构建](#五、macOS 构建)
[六、Windows 构建 A) MSYS2 MinGW(推荐)](#六、Windows 构建 A) MSYS2 MinGW(推荐))
[七、Android 构建(NDK)](#七、Android 构建(NDK))
[八、iOS/tvOS 构建](#八、iOS/tvOS 构建)
一、开工前要点(版本与许可)
- 版本来源
- 稳定版:ffmpeg.org 下载 tar.xz
- 最新主线:git clone https://github.com/FFmpeg/FFmpeg.git
- 许可与开关
- 纯 LGPL:默认(别启用 GPL/Nonfree 库)
- GPL:加上 --enable-gpl,并仅链接 GPL 兼容库(如 x264/x265)
- Nonfree:若启用 libfdk-aac 或部分专利受限 SDK,需要 --enable-nonfree(生成物不可再分发)
- 组件说明
- 程序:ffmpeg/ffprobe/ffplay(ffplay 需 SDL2)
- 库:libavcodec、libavformat、libavutil、libswscale、libswresample、libavfilter、libavdevice、libpostproc
二、通用准备(所有平台)
- 工具:C/C++ 编译器、make、pkg-config、nasm 或 yasm(建议 nasm,2.14+)
- 变量约定
- 安装前缀:PREFIX=/opt/ffmpeg 或 $HOME/ffmpeg
- 依赖前缀(第三方库):FFDEPS=$HOME/ffdeps
- 环境:export PATH=PREFIX/bin:PREFIX/bin:FFDEPS/bin:PATH;exportPKGCONFIGPATH=PATH;exportPKGCONFIGPATH=FFDEPS/lib/pkgconfig:$PKG_CONFIG_PATH
三、常见依赖库(按需选择)
- 编解码器
- x264(H.264,GPL)、x265(H.265,GPL)、libvpx(VP8/VP9,BSD)、aom/dav1d(AV1,BSD)、libxvid(MPEG-4 ASP,GPL)
- 音频:libmp3lame(MP3,LGPL/GPL)、opus(BSD)、vorbis/ogg(BSD)、fdk-aac(非自由,需 --enable-nonfree)
- 封装/网络/安全
- openssl 或 gnutls(HTTPS/RTMPS)、libsrt、librist、libssh
- 图像/滤镜
- zlib、libpng、libjpeg-turbo、libwebp、frei0r、libopencv(可选)
- 硬件加速
- Linux:libva/vaapi、vdpau、v4l2-m2m、opencl、cuda(nv-codec-headers)
- Windows:d3d11va、dxva2、AMF(AMD)
- macOS/iOS:VideoToolbox
- 依赖的构建(示例:静态安装到 $FFDEPS)
- 以 x264 为例: git clone https://code.videolan.org/videolan/x264.git cd x264 && ./configure --prefix=$FFDEPS --enable-static --disable-opencl && make -j && make install
- 以 libvpx 为例: git clone https://chromium.googlesource.com/webm/libvpx cd libvpx && ./configure --prefix=$FFDEPS --enable-vp9 --disable-examples --disable-unit-tests --enable-static && make -j && make install
- 其他库同理,尽量编成 static+pkg-config 可见的安装
四、Linux 构建
- 依赖与工具
- Debian/Ubuntu 示例: sudo apt-get update sudo apt-get install -y build-essential pkg-config nasm yasm git
libssl-dev libfreetype6-dev libfontconfig1-dev libx11-dev libxext-dev libxfixes-dev
libva-dev libvdpau-dev libdrm-dev libx264-dev libsdl2-dev
- 最小共享版(LGPL,含常见解复用与软件编解码)
- 配置 ./configure --prefix=$PREFIX --enable-shared --disable-static --disable-debug --enable-pic
- 编译安装 make -j && make install
- 桌面"全能"示例(常见外部库+硬件加速)
- 安装 nv-codec-headers(NVIDIA 硬编) git clone https://github.com/FFmpeg/nv-codec-headers && cd nv-codec-headers && make && sudo make install
- 配置(按实际已装的库增减) PKG_CONFIG_PATH=FFDEPS/lib/pkgconfig:FFDEPS/lib/pkgconfig:PKG_CONFIG_PATH
./configure --prefix=PREFIX−−enable−gpl−−enable−version3 −−enable−shared−−enable−pthreads−−enable−libx264−−enable−libx265 −−enable−libvpx−−enable−libaom−−enable−libdav1d −−enable−libopus−−enable−libmp3lame−−enable−libvorbis−−enable−libfdk−aac−−enable−nonfree −−enable−openssl−−enable−librist−−enable−libsrt −−enable−libwebp−−enable−libpng−−enable−zlib −−enable−libfreetype−−enable−libfontconfig −−enable−ffplay−−enable−sdl2 −−enable−vaapi−−enable−vdpau−−enable−opencl −−enable−nvenc−−enable−cuda−nvcc −−extra−cflags="−IPREFIX−−enable−gpl−−enable−version3 −−enable−shared−−enable−pthreads−−enable−libx264−−enable−libx265 −−enable−libvpx−−enable−libaom−−enable−libdav1d −−enable−libopus−−enable−libmp3lame−−enable−libvorbis−−enable−libfdk−aac−−enable−nonfree −−enable−openssl−−enable−librist−−enable−libsrt −−enable−libwebp−−enable−libpng−−enable−zlib −−enable−libfreetype−−enable−libfontconfig −−enable−ffplay−−enable−sdl2 −−enable−vaapi−−enable−vdpau−−enable−opencl −−enable−nvenc−−enable−cuda−nvcc −−extra−cflags="−IFFDEPS/include" --extra-ldflags="-L$FFDEPS/lib" - 编译安装 make -j$(nproc) && make install
- 备注:去掉你没有的库;如不使用非自由库,删掉 libfdk-aac 与 --enable-nonfree
- 纯静态小体积(常用于嵌入式)
- 思路:--disable-everything 后按需逐项 --enable
- 示例(mp4/h264/h265/opus 基础播放/转码) ./configure --prefix=PREFIX−−disable−everything−−enable−static−−disable−doc−−disable−debug −−enable−avcodec−−enable−avformat−−enable−avutil−−enable−swresample−−enable−swscale−−enable−avfilter −−enable−protocol=file,http,https,rtmp,rtmps −−enable−demuxer=mov,matroska,flv,avi,hls,mpegts −−enable−muxer=mp4,matroska,flv,mpegts −−enable−parser=h264,hevc,aac,opus −−enable−decoder=h264,hevc,aac,opus,mp3 −−enable−encoder=libx264,libx265,aac,libopus −−enable−filter=aresample,scale,fps −−enable−libx264−−enable−libx265−−enable−libopus −−extra−cflags="−IPREFIX−−disable−everything−−enable−static−−disable−doc−−disable−debug −−enable−avcodec−−enable−avformat−−enable−avutil−−enable−swresample−−enable−swscale−−enable−avfilter −−enable−protocol=file,http,https,rtmp,rtmps −−enable−demuxer=mov,matroska,flv,avi,hls,mpegts −−enable−muxer=mp4,matroska,flv,mpegts −−enable−parser=h264,hevc,aac,opus −−enable−decoder=h264,hevc,aac,opus,mp3 −−enable−encoder=libx264,libx265,aac,libopus −−enable−filter=aresample,scale,fps −−enable−libx264−−enable−libx265−−enable−libopus −−extra−cflags="−IFFDEPS/include -fPIC" --extra-ldflags="-L$FFDEPS/lib -static" make -j && make install
- 静态链接常见问题:需要 pkg-config --static;可能要补充依赖库顺序(ssl, crypto, pthread, dl, m, z)
五、macOS 构建
- 工具与依赖
- xcode-select --install
- brew install nasm pkg-config sdl2 libx264 x265 libvpx aom dav1d opus lame openssl@3
- 常见配置(含 VideoToolbox 硬编解/硬解)
- 配置 ./configure --prefix=$PREFIX --enable-shared --enable-gpl --enable-libx264 --enable-libx265
--enable-libvpx --enable-libaom --enable-libdav1d --enable-libopus --enable-libmp3lame
--enable-openssl --enable-ffplay --enable-sdl2 --enable-videotoolbox make -j && make install
- 通用/双架构
- 分别为 arm64 与 x86_64 编译静态库,然后用 lipo 合并(库层面常用;可选)
六、Windows 构建 A) MSYS2 MinGW(推荐)
- 安装 MSYS2 后打开 MINGW64 shell: pacman -Syu pacman -S --needed base-devel git nasm pkg-config
mingw-w64-x86_64-toolchain mingw-w64-x86_64-SDL2
mingw-w64-x86_64-openssl mingw-w64-x86_64-x264 mingw-w64-x86_64-x265
mingw-w64-x86_64-libvpx mingw-w64-x86_64-dav1d mingw-w64-x86_64-aom - 配置与编译(示例) ./configure --prefix=$PREFIX --target-os=mingw32 --arch=x86_64
--enable-shared --enable-gpl --enable-libx264 --enable-libx265
--enable-libvpx --enable-libaom --enable-libdav1d --enable-openssl
--enable-ffplay --enable-sdl2 --enable-dxva2 --enable-d3d11va make -j && make install - NVENC:先安装 nv-codec-headers(也可用预编译),再加 --enable-nvenc
B) Visual Studio(MSVC)
- 用 MSYS2/Cygwin shell 运行 ./configure(脚本需要 POSIX shell),但使用 MSVC 工具链:
- 打开 "x64 Native Tools Command Prompt for VS" 执行 vcvars64.bat
- 从该命令提示符启动 MSYS2 bash:bash
- 安装 nasm:pacman -S nasm
- 运行: ./configure --toolchain=msvc --arch=x86_64 --target-os=win64 --enable-shared --disable-static make -j
- 注意:MSVC 构建对外部库支持有限,复杂场景建议 MinGW
七、Android 构建(NDK)
- 设定 ANDROID_NDK=/path/to/android-ndk API=21 CC=ANDROIDNDK/toolchains/llvm/prebuilt/linux−x8664/bin/aarch64−linux−androidANDROIDNDK/toolchains/llvm/prebuilt/linux−x8664/bin/aarch64−linux−android{API}-clang
- 配置(arm64 示例) ./configure --prefix=PREFIX−−target−os=android−−arch=arm64 −−cc="PREFIX−−target−os=android−−arch=arm64 −−cc="CC" --enable-cross-compile --disable-debug --enable-neon
--enable-jni --enable-mediacodec --enable-vulkan --enable-static --disable-programs make -j && make install - 若要 armeabi-v7a/x86_64,切换 clang 三元组与 --arch
- 常见问题:Android 静态链接需 -fPIC;mediacodec 需要 SDK/NDK 版本较新
八、iOS/tvOS 构建
- 设备(arm64) SDK=(xcrun−−sdkiphoneos−−show−sdk−path)CC="xcrun−sdkiphoneosclang−archarm64−miphoneos−version−min=12.0"./configure−−prefix=(xcrun−−sdkiphoneos−−show−sdk−path)CC="xcrun−sdkiphoneosclang−archarm64−miphoneos−version−min=12.0"./configure−−prefix=PREFIX --target-os=darwin --arch=arm64 --enable-cross-compile
--sysroot=SDK−−cc="SDK−−cc="CC" --enable-videotoolbox --enable-static --disable-programs make -j && make install - 模拟器(x86_64 或 arm64)同理换 SDK 和 -arch;如需通用静态库,分别编译后 lipo 合并
九、硬件加速要点
- NVIDIA(NVENC/NVDEC)
- 先装 nv-codec-headers;配置加 --enable-nvenc(编码)/--enable-cuda-nvcc(可选)
- 运行时需要 NVIDIA 驱动与可用 GPU
- VAAPI(Intel/AMD iGPU)
- 安装 libva-dev;配置 --enable-vaapi;运行示例:-hwaccel vaapi -vaapi_device /dev/dri/renderD128
- V4L2 M2M(SoC 硬编硬解)
- 配置 --enable-libdrm;解码器/编码器名常带 _v4l2m2m
- Windows:--enable-d3d11va/--enable-dxva2;macOS/iOS:--enable-videotoolbox
十、验证与自检
- 看配置 ffmpeg -buildconf
- 列出支持项 ffmpeg -codecs ffmpeg -decoders ffmpeg -encoders ffmpeg -demuxers ffmpeg -hwaccels
- 依赖检查 Linux: ldd (which ffmpeg) macOS: otool -L (which ffmpeg) Windows: dumpbin /DEPENDENTS ffmpeg.exe
十一、体积与性能优化
- 体积
- 关闭未用模块:--disable-avdevice --disable-postproc --disable-network(若不用)--disable-doc
- 静态小体积:--disable-everything 按需 --enable
- strip 可执行/库;启用 LTO(--enable-lto,需编译器支持)
- 性能
- 开 NEON/SSE:--cpu=native 或 --extra-cflags/ldflags 指定
- 启用多线程(默认);合理选择硬件加速
十二、常见错误与排查
- ERROR: nasm/yasm not found
- 安装 nasm;或 PATH 未生效
- ERROR: libx264 not found
- 确认 x264 已安装到 $FFDEPS;导出 PKG_CONFIG_PATH;如静态链接,增加 --pkg-config-flags="--static"
- C compiler test failed
- 检查 CC/SDK/sysroot/交叉三元组;查看 config.log
- Undefined reference/链接错误
- 静态链接时库顺序和 --static 依赖未补齐(如 -lssl -lcrypto -lz -lpthread -lm -ldl)
- 运行时找不到 .so/.dylib/.dll
- Linux: 设定 LD_LIBRARY_PATH 或 rpath;macOS: DYLD_LIBRARY_PATH;Windows: 把 dll 放同目录或 PATH
- 非自由构建分发风险
- 启用 --enable-nonfree 后生成物不可再分发(含商用/开源发布),仅内部使用
十三、快速模板(可直接改变量跑)
- 仅软件编解码(Linux,LGPL,带 ffplay) ./configure --prefix=$PREFIX --enable-shared --enable-ffplay --enable-pthreads --enable-openssl make -j && make install
- 主流编解码全家桶(GPL,常见桌面) PKG_CONFIG_PATH=FFDEPS/lib/pkgconfig./configure−−prefix=FFDEPS/lib/pkgconfig./configure−−prefix=PREFIX --enable-gpl --enable-libx264 --enable-libx265 --enable-libvpx --enable-libaom --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-openssl --enable-ffplay make -j && make install
- 嵌入式精简(静态) ./configure --prefix=$PREFIX --disable-everything --enable-static
--enable-avcodec --enable-avformat --enable-avutil --enable-swresample --enable-swscale
--enable-decoder=h264,aac,mp3 --enable-demuxer=mov,matroska,mpegts --enable-protocol=file,http make -j && make install