live555 是一套采用rtsp协议作为其核心, 可以用来传输接收多媒体包括H264、H265、音频等多媒体数据的开源架构代码集。通过扩展一些类的方式 实现rtsp server 和client端的功能 并且提供源码。其源码 可以是从官网 http://www.live555.com下载.
如何学习live555 并且能够做到1熟悉内部架构,2修改live555实现自己的功能 3.参考live555的架构 采用自己最精简的代码模式来实现传输或者接收多媒体文件的功能。
阶段一: 了解live555的架构功能
根据我自己的理解,live555架构功能上通常都分为如下几个层次。
1.1: 标准协议的熟悉。
1.1.1 RTSP报文通信协议
live555 包含使用了 RTSP 的协议。
可以参考的文档见附件1
1.1.2 RTP 数据打包协议
RTSP协议规范 往往约定了, “交互协议”通信信令 和数据传输 采用两条支路。
可以参考的文档见附件2
1.1.3 SDP 多媒体文件描述协议
多媒体文件种类较多, 有原始的H264、 H265、G711 G726 AAC OPUS音频 。 有封装过的TS PS RTP MP4 MOV avi等文件等。
可以参考的文档见附件3
1.2:C/S 网络通信模式的熟悉
1.2.1 live555 的代码中client 和 server 通信
采用标准TCP/IP协议 进行通信。 双方通信的报文内容按照“交互协议”的约定进行。
1.2.2 live555 采用单线程的模式进行调度管理
原先可以写入不同的client客户连接管理采用循环机制管理。 内部维护多个hash表。
1.3:功能的模块化 和 架构的扩展性
1.3.1. 多媒体文件的读取 封装为frame类
用于实现从不同的源头(内存、文件IO、硬件设备如声卡和摄像头等)读取不同的文件数据到内存。
1.3.2 文件数据的解析 parse
1.3.3 文件的RTP封装传输 sink
1.3.4 和每个客户端的处理封装为 RTSPClientSession类,
用于处理单独的客户会话。
阶段二: 修改live555的代码实现自己的功能
熟悉阶段一的live555 的1.3 功能模块化 和架构的扩展性之后,修改代码实现自己的多媒体文件源头的读取处理。
阶段三: 自己重构rtsp的代码server 端代码
rtsp server 端往往很多都是在嵌入式设备上运行,资源有限。 追求精简。在完成阶段二之后,可以实现自己的 RTSPServer 维护client连接并处理, 生成自己的sdp 描述, 并且自己针对客户端的请求 读取设备文件、Sensor采集编码后的内存数据打包完成传输给客户端。
附件1:RTSP协议的描述
https://github.com/EasyDarwin/Course/blob/master/%E6%B5%81%E5%AA%92%E4%BD%93%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE(RTSP%20RTP%20SDP)%E8%AF%A6%E8%A7%A3/rtsp.md
附件2:RTP协议的描述
http://www.cnblogs.com/moonvan/archive/2011/09/11/2173448.html
附件3:SDP协议的描述
https://github.com/EasyDarwin/Course/blob/master/%E6%B5%81%E5%AA%92%E4%BD%93%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE(RTSP%20RTP%20SDP)%E8%AF%A6%E8%A7%A3/sdp.md