推流环境搭建:FFmpeg编译与安装、Live555服务器搭建、GStreamer工具链配置

说实话,很多新手一上来就急着写推流代码,结果环境没配好,折腾半天连个视频流都推不出去。我见过太多人卡在「编译报错」这一步了。这一章,咱们就把三大核心工具的环境彻底搞定。

你想想看,RTSP推流这条链路,说白了就是三件事:编码封装、流媒体服务、管道传输。FFmpeg负责编解码和封装,Live555负责RTSP协议交互,GStreamer负责构建灵活的媒体管道。这三样东西配好了,后面的调优才有根基。

本章核心目标:在Ubuntu 22.04 LTS上,从源码编译FFmpeg 6.0、搭建Live555作为RTSP服务器、配置GStreamer 1.22工具链。全部走源码编译,不依赖apt包管理器——因为生产环境里,apt给你的版本往往太老,缺少关键模块。

推流环境搭建核心组件 RTSP推流环境 FFmpeg 6.0 Live555 GStreamer 1.22 编码 / 封装 / 推流 RTSP协议 / 媒体分发 管道构建 / 动态处理 ⚠ 全部源码编译,不依赖apt包管理器 生产环境需要自定义模块开关,apt版本往往缺少关键组件

2.1 FFmpeg 6.0 源码编译与安装

FFmpeg是整个推流链路的核心。我个人习惯从源码编译,因为可以精确控制开启哪些编解码器、协议和滤镜。apt安装的版本,x264、x265这些关键编码器往往是缺失的。

2.1.1 安装编译依赖

先装基础工具链和库。这一步别偷懒,缺一个后面编译就会报错。

sudo apt update
sudo apt install -y \
  build-essential pkg-config \
  libx264-dev libx265-dev libvpx-dev \
  libfdk-aac-dev libmp3lame-dev libopus-dev \
  libssl-dev libsdl2-dev \
  nasm yasm cmake

我的经验:libfdk-aac是Fraunhofer的AAC编码器,质量比内置的aac编码器好很多。但要注意它的许可证是GPL不兼容的,如果你要分发二进制文件,得考虑许可证问题。个人使用或内部部署没问题。

2.1.2 下载并编译FFmpeg 6.0

wget https://ffmpeg.org/releases/ffmpeg-6.0.tar.xz
tar xf ffmpeg-6.0.tar.xz
cd ffmpeg-6.0

./configure \
  --prefix=/usr/local \
  --enable-gpl \
  --enable-nonfree \
  --enable-libx264 \
  --enable-libx265 \
  --enable-libvpx \
  --enable-libfdk-aac \
  --enable-libmp3lame \
  --enable-libopus \
  --enable-openssl \
  --enable-sdl2

make -j$(nproc)
sudo make install

这里有个坑。我曾经在configure阶段卡了半小时,原因是没装libx264-dev。configure脚本会检查每个库的头文件和链接,缺一个就报错退出。所以前面的依赖安装一定要完整。

2.1.3 验证安装

ffmpeg -version
ffmpeg -encoders | grep -E "x264|x265|aac"

输出里能看到libx264、libx265、libfdk_aac这些编码器,说明编译成功了。如果看不到,回去检查configure的日志,看看哪个模块被跳过了。

注意:如果你系统里之前用apt装过ffmpeg,新编译的版本会安装到/usr/local/bin。运行前检查一下PATH顺序:which ffmpeg应该指向/usr/local/bin/ffmpeg。如果指向/usr/bin/ffmpeg,说明apt版本优先级更高,可以调整PATH或者卸载旧版本。

2.2 Live555 服务器搭建

Live555是RTSP协议的老牌实现。它不依赖任何第三方库,纯C++写的,编译非常简单。但它的代码风格比较老,文档也不多,我第一次看源码时也头疼了一阵。

2.2.1 下载与编译

wget http://www.live555.com/liveMedia/public/live555-latest.tar.xz
tar xf live555-latest.tar.xz
cd live

./genMakefiles linux-64bit
make -j$(nproc)

genMakefiles会根据你的平台生成Makefile。如果你用的是其他架构,比如ARM或者macOS,需要选择对应的配置文件。linux-64bit适用于大多数x86_64的Linux系统。

2.2.2 启动RTSP服务器

cd mediaServer
./live555MediaServer

默认监听端口是8554。启动后,它会自动扫描当前目录下的媒体文件,并提供RTSP流访问。比如你放一个test.mp4在mediaServer目录下,客户端就可以通过rtsp://你的IP:8554/test.mp4来拉流。

我建议:测试阶段可以用ffplay rtsp://localhost:8554/test.mp4来验证。ffplay是FFmpeg自带的播放器,支持RTSP协议。如果画面能出来,说明Live555服务器工作正常。

2.2.3 配置多线程支持

Live555默认是单线程的,高并发场景下性能会受限。我曾在一次直播项目中,用默认配置扛200路并发,结果CPU飙到90%,延迟也上去了。后来开启了多线程支持,情况好很多。

# 在config.linux-64bit文件中添加
COMPILE_OPTS = -I. -I../UsageEnvironment/include -I../groupsock/include \
               -I../liveMedia/include -I../BasicUsageEnvironment/include \
               -DALLOW_RTSP_SERVER_PORT_REUSE=1 \
               -DENABLE_THREADING=1

重新编译后,Live555会使用线程池处理客户端连接。注意,这个选项在官方文档里提得不多,我也是翻源码才发现的。

2.3 GStreamer 工具链配置

GStreamer是个强大的多媒体框架。它不像FFmpeg那样是一个命令行工具,而是一个插件化的管道系统。你可以把各种元素(source、filter、sink)像搭积木一样串起来。

2.3.1 从源码编译GStreamer 1.22

apt安装的GStreamer版本通常比较旧,而且缺少一些关键插件。我建议从源码编译,这样可以按需开启插件。

# 安装meson构建系统
sudo apt install -y meson ninja-build

# 下载GStreamer核心库
wget https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.22.0.tar.xz
tar xf gstreamer-1.22.0.tar.xz
cd gstreamer-1.22.0

meson build --prefix=/usr/local \
  -Dbuildtype=release \
  -Dgst_debug=false \
  -Dptp-helper-permissions=none
ninja -C build
sudo ninja -C build install

2.3.2 安装必备插件

GStreamer的插件分三组:base、good、bad、ugly。名字很直白——bad插件不是质量差,而是许可证或专利问题。我们推流需要用到rtsp、rtp、x264这些插件。

# 下载并编译base插件
wget https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-1.22.0.tar.xz
tar xf gst-plugins-base-1.22.0.tar.xz
cd gst-plugins-base-1.22.0
meson build --prefix=/usr/local
ninja -C build
sudo ninja -C build install

# 下载并编译good插件(包含rtp、udp等)
wget https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-1.22.0.tar.xz
tar xf gst-plugins-good-1.22.0.tar.xz
cd gst-plugins-good-1.22.0
meson build --prefix=/usr/local
ninja -C build
sudo ninja -C build install

# 下载并编译ugly插件(包含x264)
wget https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.22.0.tar.xz
tar xf gst-plugins-ugly-1.22.0.tar.xz
cd gst-plugins-ugly-1.22.0
meson build --prefix=/usr/local
ninja -C build
sudo ninja -C build install

我曾经踩过的坑:编译ugly插件时,meson会检查系统里有没有libx264。如果你之前只装了FFmpeg的libx264,GStreamer可能找不到。解决办法是确保pkg-config --libs x264能正常输出。如果不行,检查PKG_CONFIG_PATH是否包含了/usr/local/lib/pkgconfig。

2.3.3 验证GStreamer工具链

gst-launch-1.0 --version
gst-inspect-1.0 | grep -E "rtsp|rtp|x264"

输出里应该能看到rtspclientsink、rtph264pay、x264enc这些元素。如果缺少某个元素,说明对应的插件没编译进去,需要回去检查编译日志。

2.4 环境验证:推流测试

三个工具都装好了,咱们做个简单的推流测试,验证整个链路是否通畅。

2.4.1 使用FFmpeg推流到Live555

# 启动Live555服务器(在mediaServer目录下)
./live555MediaServer &

# 使用FFmpeg推流
ffmpeg -re -i test.mp4 \
  -c:v libx264 -preset ultrafast -tune zerolatency \
  -c:a aac -b:a 128k \
  -f rtsp rtsp://localhost:8554/live/test

2.4.2 使用GStreamer拉流验证

gst-launch-1.0 rtspsrc location=rtsp://localhost:8554/live/test \
  ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink

如果画面能正常显示,说明FFmpeg编码推流、Live555协议转发、GStreamer拉流解码,整个链路都通了。嗯,到这里,你的推流环境就算搭建完成了。

环境清单总结:

组件 版本 安装路径 关键模块
FFmpeg 6.0 /usr/local libx264, libx265, libfdk-aac
Live555 2023-11-30 ~/live RTSP服务器, 多线程支持
GStreamer 1.22.0 /usr/local rtsp, rtp, x264, aac插件

这三个工具配好了,后面的章节咱们就可以开始真正调优了。从编码参数到网络传输,从延迟优化到稳定性保障,每一步都有很多细节可以挖。你想想看,同样的硬件,参数调好了延迟能从5秒降到200毫秒,这就是调优的价值。