Live555流媒体库:下载、编译、例程使用指南及Linux编译问题与解决办法

版本: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.hhUsageEnvironment.hh)即可使用 live555 提供的 API 进行流媒体应用开发

5.编译过程遇到的问题

5.1.报错信息:

核心是std::atomic_flagtest()方法兼容性问题,通过指定更高的 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())。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值