版本:live-latest.tar.gz
1. 下载 live555
可以通过官方网站下载最新版本:
# 下载源码包
wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz
# 解压
tar -zxvf live555-latest.tar.gz
cd live
2. 编译 live555
live555 提供了自动配置脚本,可根据系统环境自动生成 Makefile:
# 运行配置脚本
./genMakefiles linux # 对于Linux系统
# 其他系统可选择: solaris, freebsd, macosx, cygwin等
# 编译
make
# 安装(可选)
sudo make install
编译完成后,会在各子目录生成库文件和示例程序,主要例程位于testProgs目录下。
3.例程使用方法
3.1 流媒体服务器示例
# 启动RTSP服务器,可流式传输指定文件
cd testProgs
./testH264VideoStreamer test.264 # 流式传输H.264文件
# 服务器默认在8554端口提供RTSP服务
# 可通过rtsp://localhost:8554/testStream访问
3.2 流媒体客户端示例
# 播放RTSP流
./openRTSP rtsp://localhost:8554/testStream
# 保存流到文件
./openRTSP -4 -P 10 -b 1000000 rtsp://example.com/stream > output.ts
3.3 其他常用例程
testMP3Streamer:MP3 流媒体服务器testWAVAudioStreamer:WAV 音频流媒体服务器testH265VideoStreamer:H.265 视频流媒体服务器playSIP:SIP 协议播放示例
4. 自定义开发
如果需要基于 live555 进行二次开发,可以在自己的项目中引用编译生成的库文件,主要包含以下几个核心库:
libliveMedia.a:媒体数据处理libgroupsock.a:网络组播相关libBasicUsageEnvironment.a:环境配置libUsageEnvironment.a:使用环境
通过包含相应的头文件(如liveMedia.hh、UsageEnvironment.hh)即可使用 live555 提供的 API 进行流媒体应用开发
5.编译过程遇到的问题
5.1.报错信息:
核心是std::atomic_flag的test()方法兼容性问题,通过指定更高的 C++ 标准或修改代码使用旧标准兼容的方法即可解决。
BasicTaskScheduler.cpp: In member function ‘virtual void BasicTaskScheduler::SingleStep(unsigned int)’:
BasicTaskScheduler.cpp:191:40: error: ‘struct std::atomic_flag’ has no member named ‘test’
191 | if (fTriggersAwaitingHandling[i].test()) {
| ^~~~
make[1]: *** [Makefile:41:BasicTaskScheduler.o] 错误 1
make[1]: 离开目录“/home/lr/live555/live/BasicUsageEnvironment”
make: *** [Makefile:38:all] 错误 2
这个错误是由于编译器对 C++ 标准的支持问题导致的。std::atomic_flag::test() 方法是 C++20 标准中引入的新特性,如果编译器版本较旧或编译选项未指定正确的 C++ 标准,就会出现这个错误。
5.2.报错代码:
#ifndef NO_STD_LIB
if (fTriggersAwaitingHandling[i].test()) {
fTriggersAwaitingHandling[i].clear();
#else
if (fTriggersAwaitingHandling[i]) {
fTriggersAwaitingHandling[i] = False;
#endif
5.3解决方法如下:
方法 1:修改代码兼容旧标准(推荐)
将使用 test() 方法的代码替换为 C++11 及以上版本都支持的 test_and_set() 方式:
#ifndef NO_STD_LIB
// 替换原来的 test() 调用
if (fTriggersAwaitingHandling[i].test_and_set(std::memory_order_relaxed)) {
fTriggersAwaitingHandling[i].clear(std::memory_order_relaxed);
#else
if (fTriggersAwaitingHandling[i]) {
fTriggersAwaitingHandling[i] = False;
#endif
这种修改利用了 test_and_set() 方法(C++11 引入)来实现相同的功能,兼容性更好。
方法 2:添加编译宏定义
如果不想修改代码,可以在编译时添加 NO_STD_LIB 宏定义,让编译器使用 else 分支的兼容代码:
1.打开生成的 Makefile
2.找到 CXXFLAGS 配置行,添加宏定义
CXXFLAGS = -Wall -O2 -DNO_STD_LIB
3.重新编译:
make clean && make
方法 3:指定使用 C++20 标准
如果你的编译器支持 C++20,可以在 Makefile 中指定标准版本:
CXXFLAGS = -Wall -O2 -std=c++20
然后重新编译。这种方法最简单,但要求你的 GCC 版本至少为 10 或 Clang 版本至少为 11(这些版本才完全支持 C++20 的 atomic_flag::test())。
3974

被折叠的 条评论
为什么被折叠?



