2. 环境搭建:在Ubuntu上从源码编译安装GStreamer,以及常用插件的安装与验证
说实话,很多初学者喜欢直接 apt install 完事。但我个人强烈建议——至少做一次源码编译。
为什么?因为推流场景下,你迟早要打补丁、加自定义插件、调编译参数。如果连编译环境都没摸过,出了问题你连日志都看不懂。我在项目中遇到过好几次,线上推流卡顿,最后发现是发行版自带的 GStreamer 版本太老,缺少关键的性能补丁。那时候你只能自己编译。
好,我们开始。
2.1 为什么选择源码编译?
先看一张对比图,你就明白了。
说白了,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
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
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 用) | 必须 |
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 服务器。如果终端没有报错,恭喜你,环境搭建完成。
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,省事。