FFMPEG之完整编译指南

目录

一、开工前要点(版本与许可)

二、通用准备(所有平台)

三、常见依赖库(按需选择)

[四、Linux 构建](#四、Linux 构建)

[五、macOS 构建](#五、macOS 构建)

[六、Windows 构建 A) MSYS2 MinGW(推荐)](#六、Windows 构建 A) MSYS2 MinGW(推荐))

[七、Android 构建(NDK)](#七、Android 构建(NDK))

[八、iOS/tvOS 构建](#八、iOS/tvOS 构建)

九、硬件加速要点

十、验证与自检

十一、体积与性能优化

十二、常见错误与排查

十三、快速模板(可直接改变量跑)


一、开工前要点(版本与许可)

  • 版本来源
  • 许可与开关
    • 纯 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 构建

  1. 依赖与工具
  • 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
  1. 最小共享版(LGPL,含常见解复用与软件编解码)
  • 配置 ./configure --prefix=$PREFIX --enable-shared --disable-static --disable-debug --enable-pic
  • 编译安装 make -j && make install
  1. 桌面"全能"示例(常见外部库+硬件加速)
  • 安装 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
  1. 纯静态小体积(常用于嵌入式)
  • 思路:--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 构建

  1. 工具与依赖
  • xcode-select --install
  • brew install nasm pkg-config sdl2 libx264 x265 libvpx aom dav1d opus lame openssl@3
  1. 常见配置(含 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
  1. 通用/双架构
  • 分别为 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 工具链:
    1. 打开 "x64 Native Tools Command Prompt for VS" 执行 vcvars64.bat
    2. 从该命令提示符启动 MSYS2 bash:bash
    3. 安装 nasm:pacman -S nasm
    4. 运行: ./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
相关推荐
OH_TPC2 天前
【鸿蒙优选三方库】@ohos/ffmpeg-kit:把 FFmpeg 的全部能量带进鸿蒙
华为·ffmpeg·harmonyos·鸿蒙
是jin奥2 天前
最新 FFmpeg 安装脚本:Linux x86_64
linux·运维·ffmpeg
骑着蜗牛撵大象3272 天前
用 Codex 批量做数字人商品口播视频:从分镜 JSON 到成片校验的流水线
java·ffmpeg·json·音视频·数字人·视频·codex
企业数字化笔记2 天前
视频加放大特写后音画不同步怎么办?OpenCV转场与FFmpeg音轨续接实战
opencv·ffmpeg·音视频
开开心心就好4 天前
课堂随机点名工具,绿色版免安装双击即用
java·服务器·前端·ffmpeg·音视频·perl·symfony
小鹿软件办公4 天前
不依赖 FFmpeg 也能录屏?ShareX 22 新增录屏等十余款新工具
ffmpeg·sharex·免费录屏工具
lll23526917794 天前
Android APP短视频音频提取,主流工具怎么选
ffmpeg·音视频
成都旺小宝科技5 天前
首访决策人没来,AI一客一策两天成交!
大数据·人工智能·机器学习·ffmpeg·语音识别
余槐i5 天前
加了Cookie yt-dlp仍报HTTP 403:3个容易漏的请求头差异
python·http·ffmpeg·开发工具·yt-dlp
余槐i5 天前
yt-dlp 线程开到 16 反而更慢:1000 个视频的实测与限速原因
性能优化·ffmpeg·自动化·开发工具·yt-dlp