4. 环境搭建:FFmpeg源码编译与安装、GStreamer SDK安装、开发环境配置(Linux/Windows)

说实话,环境搭建这步最容易被低估。很多人觉得「不就是装个库吗」,结果一上手就卡住——编译报错、依赖缺失、版本冲突……我当年第一次编译 FFmpeg 时,光解决 libx264 的链接问题就折腾了大半天。所以这一章,咱们把坑提前填上。

4.1 FFmpeg 源码编译与安装

为什么非要源码编译?直接用包管理器装不好吗?嗯,这里有个现实问题:发行版自带的 FFmpeg 通常禁用了不少编码器(比如 libx264、libx265),因为专利原因。你自己编译,才能拿到完整功能。

4.1.1 Linux 环境(以 Ubuntu 22.04 为例)

我个人习惯把源码放在 /opt/ffmpeg_sources,安装到 /opt/ffmpeg,这样不会污染系统目录。

# 安装基础依赖
sudo apt update
sudo apt install -y \
  autoconf automake build-essential cmake git \
  libass-dev libfreetype6-dev libsdl2-dev libtool \
  libva-dev libvdpau-dev libvorbis-dev libxcb1-dev \
  libxcb-shm0-dev libxcb-xfixes0-dev pkg-config \
  texinfo wget zlib1g-dev nasm yasm

# 创建目录
mkdir -p ~/ffmpeg_sources ~/ffmpeg_build

# 编译 libx264
cd ~/ffmpeg_sources
git clone --depth 1 https://code.videolan.org/videolan/x264.git
cd x264
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/ffmpeg_build/bin" --enable-static
make -j$(nproc)
make install

# 编译 FFmpeg
cd ~/ffmpeg_sources
wget -O ffmpeg-7.0.tar.bz2 https://ffmpeg.org/releases/ffmpeg-7.0.tar.bz2
tar xjf ffmpeg-7.0.tar.bz2
cd ffmpeg-7.0

PATH="$HOME/ffmpeg_build/bin:$PATH" ./configure \
  --prefix="$HOME/ffmpeg_build" \
  --pkg-config-flags="--static" \
  --extra-cflags="-I$HOME/ffmpeg_build/include" \
  --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
  --extra-libs="-lpthread -lm" \
  --ld="g++" \
  --bindir="$HOME/ffmpeg_build/bin" \
  --enable-gpl \
  --enable-libx264 \
  --enable-nonfree

make -j$(nproc)
make install

# 验证
export PATH="$HOME/ffmpeg_build/bin:$PATH"
ffmpeg -version
ffmpeg -encoders | grep x264
我的经验:编译时加 -j$(nproc) 能充分利用多核,但如果你内存小于 8GB,建议改成 -j2,否则容易 OOM 卡死。我踩过这个坑,编译到 90% 突然报错,心态直接崩了。

4.1.2 Windows 环境(MSYS2 + MinGW)

Windows 下我推荐用 MSYS2,比 Cygwin 轻量,也比直接上 Visual Studio 省心。说白了,MSYS2 给你一个类 Linux 的 shell,编译流程和 Linux 几乎一样。

# 1. 下载安装 MSYS2(https://www.msys2.org/)
# 2. 打开 MSYS2 UCRT64 终端

# 更新包数据库
pacman -Syu

# 安装编译工具和依赖
pacman -S --needed \
  base-devel mingw-w64-ucrt-x86_64-toolchain \
  mingw-w64-ucrt-x86_64-x264 \
  mingw-w64-ucrt-x86_64-cmake \
  mingw-w64-ucrt-x86_64-nasm \
  mingw-w64-ucrt-x86_64-pkg-config

# 下载 FFmpeg 源码
cd /home/user
wget https://ffmpeg.org/releases/ffmpeg-7.0.tar.bz2
tar xjf ffmpeg-7.0.tar.bz2
cd ffmpeg-7.0

# 配置(注意路径用 MSYS2 风格)
./configure \
  --prefix=/usr/local \
  --enable-gpl \
  --enable-libx264 \
  --enable-nonfree \
  --disable-doc

make -j$(nproc)
make install
注意:Windows 下编译出来的 exe 依赖 MSYS2 的运行时 DLL。如果你要分发给没有 MSYS2 的机器,记得用 ldd ffmpeg.exe 查看依赖,把缺失的 DLL 一起打包。

4.2 GStreamer SDK 安装

GStreamer 的安装比 FFmpeg 友好得多。官方提供了预编译的 SDK,Windows 和 Linux 都有。但我建议 Linux 下还是走源码编译,因为你要做二次开发的话,调试符号和头文件更全。

4.2.1 Linux 下安装 GStreamer

# 方法一:apt 安装(快速,但版本可能较旧)
sudo apt install -y \
  libgstreamer1.0-0 gstreamer1.0-plugins-base \
  gstreamer1.0-plugins-good gstreamer1.0-plugins-bad \
  gstreamer1.0-plugins-ugly gstreamer1.0-libav \
  libgstreamer-plugins-base1.0-dev \
  libgstrtspserver-1.0-0 libgstrtspserver-1.0-dev

# 方法二:源码编译(推荐,用于开发)
# 下载 gst-build 元项目
git clone https://gitlab.freedesktop.org/gstreamer/gst-build.git
cd gst-build

# 使用 meson 构建
meson setup builddir --prefix=/opt/gstreamer
ninja -C builddir
ninja -C builddir install

# 验证
export GST_PLUGIN_PATH=/opt/gstreamer/lib/x86_64-linux-gnu/gstreamer-1.0
gst-launch-1.0 --version

关键点:GStreamer 的插件系统依赖 GST_PLUGIN_PATH 环境变量。如果你编译安装后运行 gst-launch-1.0 提示「No such element」,十有八九是这个变量没设对。

4.2.2 Windows 下安装 GStreamer

Windows 下直接用官方安装包最省事。去 gstreamer.freedesktop.org 下载 MSI 安装包,分两个:

组件 说明 安装路径建议
Runtime Installer 运行时,包含 DLL 和插件 C:\gstreamer\1.0\msvc_x86_64
Development Installer 开发包,包含头文件、lib、pkg-config 同上

安装完后,把 C:\gstreamer\1.0\msvc_x86_64\bin 加到系统 PATH。然后打开 cmd 验证:

gst-launch-1.0 --version
gst-inspect-1.0 --plugin
避坑:Windows 下 GStreamer 的 pkg-config 文件路径默认是 C:\gstreamer\1.0\msvc_x86_64\lib\pkgconfig。如果你用 CMake 找不到 GStreamer,记得设 PKG_CONFIG_PATH 环境变量指向这个目录。

4.3 开发环境配置

环境搭好了,接下来配置 IDE 和构建系统。我个人习惯用 VS Code + CMake,跨平台一致,团队协作也方便。

4.3.1 VS Code 配置(跨平台通用)

安装以下扩展:

  • C/C++(微软官方,提供 IntelliSense 和调试)
  • CMake Tools(构建管理)
  • Meson(如果你用 GStreamer 的 meson 构建)

然后配置 c_cpp_properties.json,让 IntelliSense 能找到 FFmpeg 和 GStreamer 的头文件:

{
  "configurations": [
    {
      "name": "Linux",
      "includePath": [
        "${workspaceFolder}/**",
        "/opt/ffmpeg/include",
        "/opt/gstreamer/include/gstreamer-1.0",
        "/opt/gstreamer/include/glib-2.0",
        "/opt/gstreamer/lib/x86_64-linux-gnu/glib-2.0/include"
      ],
      "defines": [],
      "compilerPath": "/usr/bin/gcc",
      "cStandard": "c17",
      "intelliSenseMode": "linux-gcc-x64"
    }
  ]
}

4.3.2 CMake 项目模板

下面是一个同时使用 FFmpeg 和 GStreamer 的 CMakeLists.txt 模板。我在项目中一直用这个结构,干净、可维护。

cmake_minimum_required(VERSION 3.16)
project(MediaToolkit VERSION 1.0.0 LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 查找 FFmpeg
find_package(PkgConfig REQUIRED)
pkg_check_modules(AVCODEC REQUIRED libavcodec)
pkg_check_modules(AVFORMAT REQUIRED libavformat)
pkg_check_modules(AVUTIL REQUIRED libavutil)
pkg_check_modules(SWRESAMPLE REQUIRED libswresample)

# 查找 GStreamer
find_package(GStreamer REQUIRED COMPONENTS
  core base app pbutils)

# 包含头文件
include_directories(
  ${AVCODEC_INCLUDE_DIRS}
  ${AVFORMAT_INCLUDE_DIRS}
  ${AVUTIL_INCLUDE_DIRS}
  ${SWRESAMPLE_INCLUDE_DIRS}
  ${GSTREAMER_INCLUDE_DIRS}
)

# 链接库
link_directories(
  ${AVCODEC_LIBRARY_DIRS}
  ${AVFORMAT_LIBRARY_DIRS}
  ${AVUTIL_LIBRARY_DIRS}
  ${SWRESAMPLE_LIBRARY_DIRS}
  ${GSTREAMER_LIBRARY_DIRS}
)

add_executable(media_toolkit main.cpp)

target_link_libraries(media_toolkit
  ${AVCODEC_LIBRARIES}
  ${AVFORMAT_LIBRARIES}
  ${AVUTIL_LIBRARIES}
  ${SWRESAMPLE_LIBRARIES}
  ${GSTREAMER_LIBRARIES}
)
注意:GStreamer 的 CMake 模块在 Windows 下可能找不到。这时候可以手动设 GSTREAMER_ROOT 环境变量指向安装目录,或者在 CMake 命令行加 -DGSTREAMER_ROOT=C:/gstreamer/1.0/msvc_x86_64。

4.4 环境验证与常见问题

环境配好后,跑一个简单的测试,确保两个库都能正常工作。

4.4.1 验证 FFmpeg

# 转码测试
ffmpeg -i input.mp4 -c:v libx264 -preset fast -c:a aac output.mp4

# 查看编码器支持
ffmpeg -encoders | grep -E "x264|hevc_nvenc|h264_vaapi"

4.4.2 验证 GStreamer

# 播放测试
gst-launch-1.0 filesrc location=test.mp4 ! qtdemux ! h264parse ! avdec_h264 ! videoconvert ! autovideosink

# 管道测试
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

4.4.3 常见问题速查表

问题 原因 解决方案
ffmpeg: error while loading shared libraries 动态库路径未注册 export LD_LIBRARY_PATH=/opt/ffmpeg/lib:$LD_LIBRARY_PATH
No such element "avdec_h264" GStreamer 插件未安装或路径不对 检查 GST_PLUGIN_PATH,安装 gstreamer1.0-libav
ERROR: libx264 not found 编译 FFmpeg 时未找到 x264 确保 x264 的 .pc 文件在 PKG_CONFIG_PATH 中
undefined reference to `gst_init' 链接时未链接 GStreamer 库 检查 CMake 中 target_link_libraries 是否正确
我的习惯:每次配完环境,我都会写一个 env_check.sh 脚本,把上面的验证命令全跑一遍。这样换机器或重装系统后,跑一遍脚本就知道环境是否就绪,省得一个个命令敲。

4.5 本章知识体系

下面这张图总结了整个环境搭建的脉络,从源码获取到开发验证,一目了然。

环境搭建知识体系图 环境搭建知识体系 选择目标平台 Linux (Ubuntu 22.04) Windows (MSYS2/MSI) FFmpeg 源码编译 GStreamer SDK 安装 安装依赖 → 编译 x264 → 编译 FFmpeg → 验证 安装运行时 → 安装开发包 → 配置 PATH → 验证 VS Code + CMake 开发环境 环境验证 & 常见问题排查 💡 建议:写 env_check.sh 一键验证所有组件