第3章 Live555搭建:从源码到第一个RTSP流

Live555 这套库,圈内人都知道。它不是什么商业级产品,但做原型验证、学习 RTSP 协议、甚至跑一些小规模的内网流,完全够用。我最早接触流媒体时,第一个跑通的 RTSP 服务器就是它。说实话,当时看到 VLC 能拉出画面,还挺激动的。

这一章,我们就从零开始,把 Live555 的 MediaServer 跑起来。源码下载、编译、启动、测试,一步到位。

3.1 源码下载:选对版本很重要

Live555 的源码托管在官网,没有 Git 仓库,直接给 tar.gz 包。我个人习惯用 wget 拉下来,干净利落。

# 下载最新源码(2024年版本)
wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz

# 解压
tar -xzf live555-latest.tar.gz
cd live
版本选择建议: 别追最新版。我遇到过几次新版编译报错,回退一个版本就稳了。如果你只是学习,2023 年的版本完全够用。下载页面有历史版本列表,挑一个稳定版就行。

解压后目录结构长这样:

live/
├── BasicUsageEnvironment/
├── groupsock/
├── liveMedia/
├── MediaServer/
├── testProgs/
├── UsageEnvironment/
└── config.*        # 各平台的编译配置文件

嗯,这里要注意:MediaServer 目录就是我们最终要编译的目标。其他目录是依赖库,编译时会自动链接。

3.2 编译配置:跨平台其实不复杂

Live555 的编译系统很古老——没有 CMake,没有 autotools,就是纯 Makefile + 配置文件。我第一次用的时候还愣了一下,心想这年头还有人这么搞?但用顺手了发现,其实挺直接的。

编译前先看看你的操作系统,然后执行对应的配置脚本:

操作系统 配置命令 说明
Linux (x86_64) ./genMakefiles linux-64bit 最常见,Ubuntu/CentOS 通用
Linux (32-bit) ./genMakefiles linux 老机器或嵌入式环境
macOS (Intel) ./genMakefiles macosx 注意 M1/M2 芯片需要额外处理
macOS (Apple Silicon) ./genMakefiles macosx-arm64 M1/M2 专用配置
Windows (MSYS2) ./genMakefiles mingw 需要先装 MSYS2 环境
避坑指南: 我曾经在 Ubuntu 22.04 上直接执行 ./genMakefiles linux,结果编译报错说找不到 clock_gettime。后来发现 64 位系统必须用 linux-64bit 配置。32 位配置默认没开 POSIX 时间函数。所以,64 位系统一定选 linux-64bit。

配置完成后,直接 make 就行:

make -j$(nproc)

编译过程大概 1-2 分钟。如果没报错,你会看到 MediaServer 目录下生成了 live555MediaServer 这个可执行文件。

3.3 MediaServer 启动:三行命令的事

启动 MediaServer 非常简单。它默认监听 8554 端口(不是 554,因为 554 需要 root 权限)。

cd MediaServer
./live555MediaServer

看到这行输出,就说明启动成功了:

LIVE555 Media Server version 1.11 (LIVE555 Streaming Media library version 2024.01.25)
Play streams from this server using the URL:
  rtsp://192.168.1.100:8554/<filename>

它会自动打印出本机 IP 和 RTSP URL 格式。如果你有多个网卡,它默认选第一个。我个人习惯手动指定网卡,但 Live555 没提供这个参数——想要改的话得改源码,后面章节会讲。

端口说明: 8554 是 Live555 的默认 RTSP 端口。你可以通过 -p 参数修改,比如 ./live555MediaServer -p 8555。但注意,如果改成 554,必须用 root 权限运行。

3.4 RTSP URL 格式:搞懂规则才能拉流

MediaServer 启动后,它会自动扫描当前目录下的媒体文件。你想想看,它其实就是一个文件服务器——你把视频文件丢到 MediaServer 目录下,它就能通过 RTSP 推出去。

URL 格式很简单:

rtsp://<服务器IP>:<端口>/<文件名>

举个例子:

文件位置 RTSP URL
./MediaServer/test.mp4 rtsp://192.168.1.100:8554/test.mp4
./MediaServer/subdir/video.h264 rtsp://192.168.1.100:8554/subdir/video.h264
./MediaServer/live.ts rtsp://192.168.1.100:8554/live.ts
支持的格式: Live555 原生支持 MPEG-TS、H.264、H.265、MP3、AAC、WAV 等常见格式。但 MP4 文件需要是“流式兼容”的——说白了就是 moov atom 必须在文件开头。如果遇到 MP4 拉不了流,用 ffmpeg -i input.mp4 -movflags faststart output.mp4 转一下就好了。

3.5 客户端测试:验证你的服务器

服务器跑起来了,怎么验证?最常用的工具是 VLC 和 FFmpeg。我个人更推荐 FFmpeg,因为能看到详细的协议交互日志。

方法一:VLC 拉流

  1. 打开 VLC,点击「媒体」→「打开网络串流」
  2. 输入 rtsp://192.168.1.100:8554/test.mp4
  3. 点击「播放」

如果一切正常,VLC 会开始播放视频。如果卡在缓冲界面,八成是文件格式不兼容,或者防火墙没放行 8554 端口。

方法二:FFmpeg 拉流(推荐)

ffplay rtsp://192.168.1.100:8554/test.mp4

或者用 FFmpeg 转存到本地文件:

ffmpeg -i rtsp://192.168.1.100:8554/test.mp4 -c copy output.mp4

用 FFmpeg 的好处是,如果拉流失败,它会直接打印错误信息。比如:

[rtsp @ 0x7f8b1c000b80] method DESCRIBE failed: 404 Not Found

看到 404,说明文件名写错了,或者文件不在 MediaServer 目录下。

方法三:用 OpenRTSP 命令行测试

Live555 自带了一个测试工具 openRTSP,在 testProgs 目录下。编译完就有:

./testProgs/openRTSP -4 rtsp://192.168.1.100:8554/test.mp4

-4 参数表示只保存视频轨,不保存音频。它会生成一个 video-H264-1 文件,直接用 VLC 就能打开。

3.6 整体流程回顾

这一套流程走下来,其实就四步:下载 → 配置 → 编译 → 运行。但每一步都有小坑。我画了一张图,帮你把整个链路串起来:

Live555 搭建与测试流程 1. 下载源码 2. 配置编译 3. 启动服务 4. 准备媒体文件 5. 构造 RTSP URL 6. 客户端拉流测试 ⚠ 常见问题 • 编译报错 → 检查 config 文件是否匹配系统架构 • 拉流 404 → 文件路径或文件名写错了 VLC 拉流 • 图形界面,操作简单 • 错误信息不直观 • 适合快速验证 FFmpeg 拉流 • 命令行,日志详细 • 支持转存和转码 • 适合调试和自动化 openRTSP 拉流 • Live555 原生工具 • 可保存原始码流 • 适合协议分析

3.7 避坑总结

最后,我把这些年踩过的坑列一下,你遇到类似问题可以直接翻:

  • 编译报错找不到头文件:多半是 genMakefiles 选错了平台配置。64 位系统用 linux-64bit,别偷懒。
  • 启动后客户端连不上:先 telnet 192.168.1.100 8554 试试端口通不通。不通就去检查防火墙。
  • VLC 播放卡住:文件格式问题。MP4 的话用 ffmpeg -i input.mp4 -movflags faststart output.mp4 重新封装一下。
  • 多网卡环境 IP 不对:Live555 默认选第一个网卡。想指定网卡得改源码,后面章节会讲怎么改。
  • 端口被占用:用 lsof -i :8554 查一下谁在占用,或者换个端口启动。

嗯,到这里,你的第一个 RTSP 流媒体服务器就跑起来了。虽然 Live555 功能简单,但作为学习 RTSP 协议的起点,它足够轻量、足够透明。后面我们会在这个基础上,一步步加功能、做优化。