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
相关推荐
食指Shaye2 小时前
免费视频编辑软件FFmpeg 在windows上使用CMD命令行的操作说明
windows·ffmpeg
活捉一个坏小孩14 天前
Nvidia FFmpeg安装说明
ffmpeg
WF_YL14 天前
如何删除 Oracle 过期 key / 数据,删除目的的key
ffmpeg
浩瀚之水_csdn15 天前
avcodec_find_decoder函数详解
ffmpeg
浩瀚之水_csdn18 天前
avcodec_parameters_copy详解
linux·人工智能·ffmpeg
不吃鱼的猫74822 天前
【ffplay 源码解析系列】02-核心数据结构详解
c++·ffmpeg·音视频
不吃鱼的猫74822 天前
【ffplay 源码解析系列】01-开篇-ffplay整体架构与启动流程
c++·架构·ffmpeg·音视频
REDcker23 天前
FFmpeg开发者快速入门
ffmpeg
不吃鱼的猫74824 天前
【从零手写播放器:FFmpeg 音视频开发实战】04-封装格式与多媒体容器
c++·ffmpeg·音视频