2. 环境搭建:在Ubuntu上从源码编译安装GStreamer,以及常用插件的安装与验证

说实话,很多初学者喜欢直接 apt install 完事。但我个人强烈建议——至少做一次源码编译。

为什么?因为推流场景下,你迟早要打补丁、加自定义插件、调编译参数。如果连编译环境都没摸过,出了问题你连日志都看不懂。我在项目中遇到过好几次,线上推流卡顿,最后发现是发行版自带的 GStreamer 版本太老,缺少关键的性能补丁。那时候你只能自己编译。

好,我们开始。

2.1 为什么选择源码编译?

先看一张对比图,你就明白了。

apt 安装 vs 源码编译:核心差异 apt install(省心但受限) • 二进制包,开箱即用 • 版本由发行版仓库决定 • 插件固定,无法裁剪 • 无法打性能补丁 • 调试符号可能不全 • 适合快速验证 源码编译(灵活但费时) • 可选最新稳定版或开发版 • 可开启/关闭特定功能 • 可打自定义补丁 • 可启用调试符号 • 可交叉编译到嵌入式平台 • 适合生产环境定制 建议:开发阶段用 apt 快速上手,生产环境务必源码编译

说白了,apt 装的是「别人编译好的」,源码编译是「你自己掌控的」。推流这种对延迟和稳定性要求高的场景,我建议你走源码路线。

2.2 安装编译依赖

在 Ubuntu 上,第一步是把编译工具链和基础库装好。别怕,就一条命令。

sudo apt update
sudo apt install -y \
  build-essential \
  meson \
  ninja-build \
  pkg-config \
  libglib2.0-dev \
  libgudev-1.0-dev \
  libtool \
  autoconf \
  automake \
  bison \
  flex \
  python3-pip \
  python3-dev \
  cmake
小提示:Meson 是 GStreamer 官方推荐的构建系统,比老旧的 autotools 快很多。如果你还在用 autotools 那套,建议趁这次切换到 Meson。

2.3 下载 GStreamer 源码

GStreamer 是一个模块化项目。核心库叫 gstreamer,插件分 base、good、bad、ugly 四组。推流场景下,你至少需要 base 和 good。

我个人习惯统一放到 ~/gst-build 目录下管理:

mkdir -p ~/gst-build && cd ~/gst-build

# 下载核心模块
git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git
git clone https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git
git clone https://gitlab.freedesktop.org/gstreamer/gst-plugins-good.git
git clone https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad.git
git clone https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly.git
git clone https://gitlab.freedesktop.org/gstreamer/gst-libav.git
注意:如果你在中国大陆,GitLab 可能访问较慢。建议使用镜像源,或者提前下载好 tar 包。我曾经因为网络问题卡了半小时,后来直接换了国内镜像,一分钟搞定。

2.4 编译与安装

GStreamer 的编译顺序有讲究。必须先编译核心库,再编译插件。因为插件依赖核心库的头文件和动态库。

我建议按这个顺序来:

步骤 模块 编译命令 说明
1 gstreamer meson build && ninja -C build && sudo ninja -C build install 核心库,必须先装
2 gst-plugins-base meson build && ninja -C build && sudo ninja -C build install 基础插件,如 videotestsrc
3 gst-plugins-good meson build && ninja -C build && sudo ninja -C build install 高质量插件,如 rtp、rtmp
4 gst-plugins-bad meson build && ninja -C build && sudo ninja -C build install 实验性插件,按需编译
5 gst-plugins-ugly meson build && ninja -C build && sudo ninja -C build install 含专利问题的编解码器
6 gst-libav meson build && ninja -C build && sudo ninja -C build install FFmpeg 封装,推荐安装

每个模块的编译命令其实一样。以核心库为例:

cd ~/gst-build/gstreamer
meson setup build \
  --prefix=/usr \
  -Dbuildtype=debugoptimized \
  -Dgst_debug=true
ninja -C build
sudo ninja -C build install
关键参数说明:
  • --prefix=/usr:安装到系统目录,方便 pkg-config 查找
  • -Dbuildtype=debugoptimized:保留调试信息的同时开启优化
  • -Dgst_debug=true:启用 GStreamer 调试日志,排查问题必备

嗯,这里要注意:如果你之前用 apt 装过 GStreamer,建议先卸载干净,否则头文件和库会冲突。我曾经踩过这个坑,编译出来的程序链接了旧版本的库,调试了一下午才发现。

sudo apt remove --purge 'gstreamer*' 'libgstreamer*'
sudo apt autoremove

2.5 常用推流插件清单

推流场景下,你真正高频使用的插件其实就这些:

插件名称 所属模块 用途 是否必须
videotestsrc base 测试视频源 推荐
audiotestsrc base 测试音频源 推荐
x264enc ugly H.264 软件编码 必须
nvh264enc bad NVIDIA 硬件编码 按需
rtpbin good RTP 推流核心 必须
rtmpsink bad RTMP 推流 必须
udpsink base UDP 推流 推荐
mpegtsmux bad MPEG-TS 封装 按需
flvmux good FLV 封装(RTMP 用) 必须
我的经验:如果你用 NVIDIA 显卡,nvh264enc 能大幅降低 CPU 占用。但要注意驱动版本,我曾在 Ubuntu 20.04 上因为驱动太旧,编译了半天才发现不支持。

2.6 验证安装是否成功

装完别急着写代码。先跑几个命令,确认环境没问题。

第一步:检查版本

gst-launch-1.0 --version
# 输出示例:
# GStreamer 1.24.0
# https://gitlab.freedesktop.org/gstreamer/gstreamer/-/tree/main

第二步:列出可用插件

gst-inspect-1.0 | grep -E "videotestsrc|x264enc|rtmpsink|flvmux"

如果每个插件都能找到,说明编译安装成功。如果某个插件没出现,回到对应模块目录重新编译,检查是否有编译错误。

第三步:跑一个最简单的推流测试

gst-launch-1.0 videotestsrc ! x264enc ! flvmux ! rtmpsink location="rtmp://localhost/live/test"

这条命令会生成一个测试视频,用 H.264 编码,封装成 FLV,然后推送到本地的 RTMP 服务器。如果终端没有报错,恭喜你,环境搭建完成。

常见坑:如果你没有启动 RTMP 服务器(如 nginx-rtmp),这条命令会报连接失败。没关系,这属于服务器端的问题,不是 GStreamer 的问题。你可以先用 filesink 替代 rtmpsink 测试编码和封装是否正常:
gst-launch-1.0 videotestsrc ! x264enc ! flvmux ! filesink location=test.flv

2.7 环境变量配置

最后一步,配置环境变量。这样你每次打开终端,GStreamer 都能找到插件路径。

echo 'export GST_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/gstreamer-1.0' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
小技巧:如果你编译时用了 --prefix=/usr/local,那路径要改成 /usr/local/lib/x86_64-linux-gnu/gstreamer-1.0。我个人习惯用 /usr,省事。