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
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
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_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 本章知识体系
下面这张图总结了整个环境搭建的脉络,从源码获取到开发验证,一目了然。