2. 流媒体基础

说实话,很多同学做流媒体开发,上来就急着写代码、调管线。结果呢?编译环境缺库、系统参数没调、网络端口不通——折腾半天,问题全出在基础上。我刚开始带项目那会儿也吃过这个亏,后来学乖了:先把地基打牢,后面才走得顺。

这一章,我们就来搞定四件事:Linux系统配置、FFmpeg编译安装、GStreamer框架安装、网络环境检测。每一步我都会把坑点讲清楚。

1. Linux系统基础配置

我推荐用 Ubuntu 20.04/22.04 LTS 或者 CentOS 7/8。为什么?因为这两个发行版的包管理最成熟,社区支持也最好。你想想看,如果系统本身就不稳定,后面推流的时候突然崩了,那多尴尬。

1.1 系统更新与基础工具

拿到一台新机器,第一件事就是更新系统。我个人习惯先跑一遍:

# Ubuntu/Debian
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential git curl wget vim net-tools

# CentOS/RHEL
sudo yum update -y
sudo yum groupinstall -y "Development Tools"
sudo yum install -y git curl wget vim net-tools
小提示:build-essential 或 Development Tools 包含了 gcc、g++、make 等编译工具链。如果你后面编译 FFmpeg 时报错说找不到编译器,八成是这步没做。

1.2 内核参数调优

流媒体对网络和内存的要求比较高。我记得有一次线上推流卡顿,查了半天发现是系统默认的 socket buffer 太小。所以,建议你提前调一下:

# 编辑 /etc/sysctl.conf,追加以下内容
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.netdev_max_backlog = 5000

# 生效
sudo sysctl -p
注意:这些参数不是越大越好。比如 rmem_max 设得太大,反而会浪费内存。我一般根据实际推流路数来调,单路 4K 流的话,16MB 足够了。

1.3 防火墙与SELinux

RTSP 默认使用 554 端口,但很多云服务器默认是关闭的。另外,SELinux 也是个坑——我曾经被它坑过一整天,明明服务跑着,客户端就是连不上。

# 开放 RTSP 端口
sudo ufw allow 554/tcp
sudo ufw allow 554/udp

# 如果不想折腾 SELinux,可以先设为 permissive
sudo setenforce 0
# 永久关闭(不推荐生产环境)
# sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

2. FFmpeg编译安装

为什么不用 apt 直接装?因为官方源里的 FFmpeg 版本太旧,而且很多关键模块(比如 x264、x265、libvpx)都没编译进去。我们自己编译,才能按需定制。

2.1 安装依赖库

FFmpeg 的依赖库很多,但核心的就这几个:

sudo apt install -y \
  libx264-dev libx265-dev libvpx-dev \
  libfdk-aac-dev libmp3lame-dev libopus-dev \
  libssl-dev libsdl2-dev libva-dev libvdpau-dev
避坑指南:libfdk-aac 的许可证和 GPL 不兼容,如果你要分发编译好的 FFmpeg 二进制文件,记得加上 --enable-nonfree。如果只是自己用,那就无所谓了。

2.2 下载与编译

我个人习惯把源码放在 /usr/local/src 下:

cd /usr/local/src
wget https://ffmpeg.org/releases/ffmpeg-6.1.tar.xz
tar -xf ffmpeg-6.1.tar.xz
cd ffmpeg-6.1

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

make -j$(nproc)
sudo make install

编译时间取决于你的机器性能。我笔记本上大概要 5-10 分钟,服务器上会快一些。等的时候可以喝杯咖啡。

2.3 验证安装

ffmpeg -version
# 输出中应该能看到 --enable-libx264 --enable-libfdk-aac 等字样

ffmpeg -encoders | grep x264
# 确认 x264 编码器可用

3. GStreamer框架安装

FFmpeg 是瑞士军刀,GStreamer 则是乐高积木。它用 pipeline 的方式组合各种插件,非常适合做流媒体管线。我个人更喜欢用 GStreamer 做推流,因为它的架构更清晰,调试也方便。

3.1 安装核心库与插件

# Ubuntu 20.04/22.04
sudo apt install -y \
  libgstreamer1.0-0 gstreamer1.0-tools \
  gstreamer1.0-plugins-base \
  gstreamer1.0-plugins-good \
  gstreamer1.0-plugins-bad \
  gstreamer1.0-plugins-ugly \
  gstreamer1.0-libav \
  libgstreamer-plugins-base1.0-dev
插件分类说明:
  • base:基础插件,几乎必装
  • good:质量高、许可证友好的插件
  • bad:可能有问题,但功能强大的插件(比如 RTSP 相关)
  • ugly:许可证有争议,但很实用的插件(比如 MP3、x264)
  • libav:封装了 FFmpeg 的解码器

3.2 验证安装

gst-launch-1.0 --version
# 输出 GStreamer 版本号

gst-inspect-1.0 | grep rtsp
# 确认 RTSP 相关插件已安装

如果 gst-inspect-1.0 | grep rtsp 没有输出,说明 bad 插件没装全。可以单独安装:

sudo apt install -y gstreamer1.0-rtsp

4. 网络环境检测

环境搭好了,网络不通等于白搭。我见过太多人卡在这一步——防火墙没关、端口被占用、带宽不够,各种问题。

4.1 端口连通性测试

先确认 RTSP 默认端口 554 是否可用:

# 查看端口是否被占用
sudo netstat -tlnp | grep 554

# 如果没有输出,说明端口空闲
# 如果有输出,看是什么进程占用了,必要时杀掉

4.2 带宽与延迟测试

推流对带宽要求很高。我一般用 iperf3 来测:

# 服务端(推流端)
iperf3 -s

# 客户端(拉流端)
iperf3 -c 192.168.1.100 -t 30 -b 100M

如果测出来的带宽低于 50Mbps,推 4K 流基本没戏。1080p 的话,20Mbps 以上勉强够用。

注意:iperf3 测试的是 TCP 吞吐量。RTSP 虽然基于 TCP,但 RTP 数据流通常走 UDP。如果你用 UDP 推流,建议加 -u 参数再测一次:iperf3 -c 192.168.1.100 -u -b 50M。

4.3 防火墙规则检查

很多云服务器默认只开放 22 端口。你需要确保以下端口是放行的:

端口 协议 用途
554 TCP/UDP RTSP 控制信令
5000-5050 UDP RTP 数据流(动态端口范围)
1935 TCP RTMP 推流(可选)

检查防火墙规则:

sudo ufw status verbose
# 或者
sudo iptables -L -n -v

5. 本章知识体系总览

下面这张图把本章的核心内容串起来了。你可以把它当作一个检查清单:

环境准备知识体系 环境准备 Linux系统配置 系统更新 & 基础工具 内核参数调优 防火墙 & SELinux FFmpeg编译安装 安装依赖库 ./configure & make 验证编码器可用性 GStreamer安装 核心库 + 插件组 base/good/bad/ugly 验证RTSP插件 网络环境检测 端口连通性测试 带宽 & 延迟测试 防火墙规则检查

这张图里,四个分支是并列关系。你不需要按顺序做,但我建议先搞定系统配置,再装 FFmpeg 和 GStreamer,最后测网络。因为网络检测依赖前面装好的工具(比如 iperf3)。

6. 常见问题与避坑

  • 编译 FFmpeg 时报错 "nasm not found":装一下 nasm 就好。x264 汇编优化依赖它。
  • GStreamer 的 RTSP 插件找不到:检查一下是不是只装了 base 和 good,没装 bad。RTSP 相关插件在 bad 里。
  • iperf3 测试带宽正常,但推流卡顿:可能是 UDP 丢包。加 -u 参数测一下丢包率,如果超过 1%,就得优化网络了。
我的经验:环境准备这一步,花 1 小时做扎实,后面能省 10 小时的调试时间。别急着往下走,先把每个命令跑通,把每个验证点过一遍。磨刀不误砍柴工。