Live555 Media Server是一个RTSP服务端程序,它支持Stream多种媒体格式文件,具体如下:
- MPEG Transport Stream file(.ts)
- Matroska file(.mkv)
- WebM file(.webm)
- Ogg file(.ogg, .ogv, .opus)
- MPEG-1 or 2 Program Stream file(.mpg)
- MPEG-4 Video Elementary Stream file(.m4e)
- H.264 Video Elementary Stream file(.264)
- H.265 Video Elementary Stream file(.265)
- VOB video+audio file(.vob)
- DV video file(.dv)
- MPEG-1 or 2 (including layer III) audio file(.mp3)
- WAV(PCM) audio file(.wav)
- AMR audio file(.amr)
- AC-3 audio file(.ac3)
- AAC(ADTS format) audio file(.aac)
所串出的流支持通过标准RTSP/RTP媒体客户端进行接收或播放,如:
- VLC media player
- QuicTime Player
- Amino set-top boxes(仅支持MPEG ts流)
- openRTSP命令行客户端,可接收/存储流数据,但不支持播放
Notes:
- 服务端可并行传输同个流
- 默认情况下,服务端通过RTP/UDP packets传输流,但如果发起客户端使用RTSP,则服务端可通过TCP传输RTP/RTCP packets进行串流(这在需要穿透防火墙时尤其有用)
- 部分非标准RTSP客户端如Amino,会请求原始UDP流而不是标准RTP流。尽管如此,服务端仍然会进行匹配,从而提供所需串流服务。
获取 Live555 Media Server
已编译可执行文件
现已对如下平台进行预编译支持:
- MacOSX(on Intel x86 processors:)live555MediaServer
- Linux(on Intel x86 processors:)live555MediaServer
- FreeBSD(on Intel x86 processors:)live555MediaServer
如上述中未包含所需平台,则需要手动编译源码。
源码编译
这里我们不使用官方文档中说明进行Windows平台编译,一来是实际操作过程中容易出错,二来VS编译便于后面的源码分析及调试。
1. 下载源码
打开src链接中对应源码,下载下图中任一文件:
逐层解压(推荐使用开源软件7-Zip)后获得如下文件夹:
2. 源码概述
进入“live”文件夹,可看到目录结构如下,由于使用VS进行编译,其他文件(config*)无关联,所以这里只关注几个文件夹:
结合官方文档说明,可对各文件夹总结如下:
groupsock
静态库,封装了network interfaces和sockets。举例而言,Groupsock类中封装了一个收发组播数据包的socket。liveMedia
静态库,定义了一系列类簇,根类为Medium,这些类支持了多种媒体类型和编解码器。WindowsAudioInputDevice
静态库,实现了liveMedia中的AudioInputDevice虚基类,可为Windows程序提供从输入设备中读取PCM audio samples的功能。-
UsageEnvironment
静态库,内部主要有如下几个虚基类:-
TaskScheduler
为DelayedTask、socket后台操作处理、事件event提供调度支持 -
HashTable
定义通用hash表的接口,供其他代码使用 -
UsageEnvironment
集成TaskScheduler、groupsock、liveMedia等模块功能,添加Result、Error消息机制,从而提供使用环境。
-
TaskScheduler
BasicUsageEnvironment
静态库,由于UsageEnvironment中仅给出虚基类定义,为了能够真正地运行,所以从UsageEnvironment继承并实现了BasicUsageEnvironment类。它用于实现易用的命令行程序,其中,Read events和delayed operations通过select()循环进行支持。-
mediaServer
可执行文件,通过逻辑集成上述库所提供的的功能,提供串流服务。
3. 编译过程
经过前面的介绍,相信对live555有了大致的了解,下面就逐步进行真正的live555MediaServer编译。
3.1 建立Projects
首先建立控制台空项目live555MediaServer(名称可自定):
依次建立库空项目 groupsock, liveMedia, UsageEnvironment, BasicEnvironment, WindowsAudioInputDevice:
建立完成后,应该共有如下图所示的6个项目:
3.2 补全项目信息
静态库中以UsageEnvironment为例,其余4个可参照即可。
UsageEnvironment
首先将源码live文件夹中同名子文件夹内容完整拷贝至VS中UsageEnvironment项目对应文件夹中。
然后再VS项目上右键添加文件(*.cpp)至项目中:
此时尝试直接编译,发现如下错误信息:
从错误信息中可以看到,原因是无法查找到头文件所在位置,因此需要添加对应文件所在路径至“包含目录”内。
其他库可能依赖的头文件也不同,一种偷懒的方式是将如下目录全部添加至每个项目的“包含目录”中。
.\;
..\groupsock\include;
..\UsageEnvironment\include;
..\BasicUsageEnvironment\include;
..\liveMedia\include;
如提示部分安全性error,则可在“预处理器定义”中定义对应宏。
_CRT_SECURE_NO_WARNINGS
_WINSOCK_DEPRECATED_NO_WARNINGS
再次编译后通过。
live555MediaServer
同上述方式,添加文件,配置目录。
由于是可执行文件,且使用到其他库函数,因此需额外配置库文件信息。
至此,所有Debug版本编译完成。
4. 测试编译结果
拷贝bipbop-gear1-all.ts至live555MediaServer.exe同一目录下,双击运行live555MediaServer文件。
以VLC客户端为例,输入MediaServer运行后命令行输出中的rstp地址前缀。
正常播放结果如下:
5.后记
粗通编译原理后编译思路上并无太大困难,需要注意的是应结合官方文档进行预先理解。
后续会陆续更新源码解析部分,所有文章中,如有疑虑或发现错误,欢迎指出。