1. 项目概述:live555基础与应用场景
live555是一个开源的流媒体处理框架,主要用于实现RTSP/RTP/HTTP等协议的流媒体传输。这个C++库在安防监控、视频会议、在线教育等领域有广泛应用,其代码结构清晰且跨平台支持良好。最近在开发一个需要实时视频传输的项目时,我重新梳理了live555的编译和使用流程,发现网上很多教程存在信息过时或步骤缺失的问题。
2. 环境准备与源码获取
2.1 系统环境要求
live555可以在Windows、Linux和macOS上编译运行。根据我的经验:
- Linux(推荐Ubuntu 18.04+)编译最顺利
- Windows需要MinGW或Cygwin环境
- macOS需要注意Xcode命令行工具的版本兼容性
重要提示:建议使用较新的gcc/g++版本(至少gcc7+),我在gcc5环境下遇到过标准库兼容性问题。
2.2 源码下载与结构解析
最新源码应直接从官网获取:
bash复制wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz
tar -xzf live555-latest.tar.gz
cd live
目录结构说明:
BasicUsageEnvironment/基础工具类groupsock/网络通信组件liveMedia/核心媒体处理UsageEnvironment/环境抽象层testProgs/示例程序
3. 编译配置与实战
3.1 Linux平台编译
首先生成Makefile:
bash复制./genMakefiles linux
编译全部内容:
bash复制make -j$(nproc)
编译完成后关键产出:
- 静态库:
libliveMedia.a等 - 测试程序:
testProgs/目录下 - 媒体服务器:
mediaServer/live555MediaServer
3.2 Windows交叉编译
使用MinGW-w64的典型命令:
bash复制./genMakefiles mingw
make -j4
常见问题处理:
- 如果遇到
winsock2.h冲突,修改groupsock/include/NetCommon.h:
cpp复制#define USE_GNU_FIX 1 // 添加这行
#include <winsock2.h>
- 链接错误时尝试添加:
bash复制export LIBS="-lws2_32 -lwsock32"
3.3 关键编译参数
在config.linux中可调整:
makefile复制COMPILE_OPTS = -Wall -O2 -DSOCKLEN_T=socklen_t -DNO_SSTREAM=1 -fPIC
C_FLAGS = $(COMPILE_OPTS) -I. -Iinclude
CXXFLAGS = $(COMPILE_OPTS) -I. -Iinclude
性能优化建议:对于x86平台可添加
-march=native,嵌入式设备需调整-O优化级别。
4. 示例程序深度解析
4.1 testOnDemandRTSPServer
这是最常用的点播服务器示例:
bash复制./testProgs/testOnDemandRTSPServer
服务启动后会监听554端口,默认加载当前目录下的媒体文件。通过VLC等客户端输入:
code复制rtsp://<服务器IP>:554/<文件名>
关键代码逻辑:
- 创建TaskScheduler和UsageEnvironment
- 初始化RTSPServer
- 注册媒体文件处理类
- 进入事件循环
4.2 openRTSP客户端示例
录制RTSP流的实用工具:
bash复制./testProgs/openRTSP -v -t rtsp://example.com/test.mp4
参数说明:
-d <秒数>录制时长-P <端口>本地接收端口-4强制IPv4-F <前缀>输出文件名前缀
4.3 自定义流媒体源
实现FramedSource子类的关键方法:
cpp复制void MyVideoSource::doGetNextFrame() {
// 填充fTo, fFrameSize, fNumTruncatedBytes
// 设置fDurationInMicroseconds
afterGetting(this); // 回调通知
}
5. 高级应用与性能优化
5.1 多播传输配置
在testOnDemandRTSPServer启动时添加参数:
bash复制./testProgs/testOnDemandRTSPServer -M
客户端需要加入多播组:
cpp复制in_addr multicastAddr;
multicastAddr.s_addr = our_inet_addr("239.255.42.42");
Groupsock gs(env, multicastAddr, 1234, 255);
5.2 QOS参数调优
关键参数调整位置:
cpp复制OutPacketBuffer::maxSize = 200000; // 增加jitter buffer
Socket::setSendBufferTo(envir(), 1024*1024); // 发送缓冲区
5.3 内存管理技巧
- 使用
Medium::close()而非直接delete - 定期检查
UsageEnvironment::reclaim()状态 - 对于H.264流,设置:
cpp复制H264VideoStreamDiscreteFramer::maxNumPendingReads = 10;
6. 常见问题排查指南
6.1 连接问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 客户端无法连接 | 防火墙阻止554端口 | sudo ufw allow 554/tcp |
| 只有音频无视频 | SDP协商失败 | 检查媒体文件的fmtp参数 |
| 播放卡顿 | 网络抖动大 | 调整OutPacketBuffer::maxSize |
6.2 编译错误处理
undefined reference to 'log2':
bash复制export LIBS="-lm"
- C++11兼容性问题:
修改config.*添加:
makefile复制CXXFLAGS += -std=c++11
- Android交叉编译时:
需要额外传递SYSROOT和CROSS_COMPILE参数
6.3 运行时报错处理
Failed to create TCP socket:
检查端口占用情况:
bash复制ss -tulnp | grep 554
no supported Common Intermediate Format:
转换媒体文件格式:
bash复制ffmpeg -i input.mp4 -c:v libx264 -profile:v baseline output.mp4
7. 实际项目集成建议
在商业项目中建议:
- 封装动态库:
bash复制g++ -shared -o liblive555.so *.o -lssl -lcrypto
- 内存泄漏检测:
cpp复制#define DEBUG 1
#define DEBUG_LOCKS 0 // 减少调试输出
-
日志增强方案:
继承UsageEnvironment重写log()方法 -
性能监控点:
RTPSink::totalBWUsage()PacketLossStats类统计丢包
我在实际项目中发现,对于1080p视频流,建议服务器配置至少:
- 4核CPU
- 8GB内存
- 千兆网络
- SSD存储(对于高并发点播)
live555虽然代码有些陈旧,但通过合理封装和优化,仍然能支撑百万级的日连接量。最近在处理一个监控项目时,我们通过调整TCP发送缓冲区和优化帧调度算法,将单机并发流从200提升到了500路。
