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
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
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
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 -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. 本章知识体系总览
下面这张图把本章的核心内容串起来了。你可以把它当作一个检查清单:
这张图里,四个分支是并列关系。你不需要按顺序做,但我建议先搞定系统配置,再装 FFmpeg 和 GStreamer,最后测网络。因为网络检测依赖前面装好的工具(比如 iperf3)。
6. 常见问题与避坑
- 编译 FFmpeg 时报错 "nasm not found":装一下 nasm 就好。x264 汇编优化依赖它。
- GStreamer 的 RTSP 插件找不到:检查一下是不是只装了 base 和 good,没装 bad。RTSP 相关插件在 bad 里。
- iperf3 测试带宽正常,但推流卡顿:可能是 UDP 丢包。加 -u 参数测一下丢包率,如果超过 1%,就得优化网络了。