转载自:http://nkwavelet.blog.163.com/blog/static/22775603820141198337651/
此系列文章主要总结一下我在学习RTMP协议以及LibRTMP源代码过程中积累的经验。 详细分析了RTMP源代码是如何与RTMP协议对应起来的,使得代码与协议有明确的对应关系,便于理解协议和使用LibRTMP。最后给出一个实例,利用libRTMP推送H264和AAC编码的音视频直播流。
在此对以上牛人表示感谢!
1. 背景知识
RTMP(Real Time Messaging Protocol)实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。RTMP协议广泛用于直播、点播、聊天等应用,以及pc、移动、嵌入式等平台,是做流媒体开发经常会接触到的协议。想要了解RTMP,需要首先了解Flash流媒体系统。最简单的Flash流媒体系统由两部分组成:
客 户 端:Flash Player(一般只有这一种)2. libRTMP源代码分析
学习libRTMP源代码之前需要有一定的Socket编程的基础。首先需要学习《RTMP协议规范》,
中文版下载地址:http://download.csdn.net/detail/leixiaohua1020/6563059
英文版下载地址:http://www.adobe.com/cn/devnet/rtmp.html
2.1 RTMP流媒体播放过程
我们必须了解rtmp服务器和flash播放器客户端之间是怎样的一个交互流程。通过阅读RTMP协议就可以了解,这里把它归纳总结如下:
2.2 RTMP协议简单分析
RTMP协议是一个互联网TCP/IP五层体系结构中应用层的协议。RTMP协议中基本的数据单元称为消息(Message)。当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk)。
2.2.1 消息
消息是RTMP协议中基本的数据单元。不同种类的消息包含不同的Message Type ID,代表不同的功能。RTMP协议中一共规定了十多种消息类型,分别发挥着不同的作用。例如,Message Type ID在1-7的消息用于协议控制,这些消息一般是RTMP协议自身管理要使用的消息,用户一般情况下无需操作其中的数据。Message Type ID为8,9的消息分别用于传输音频和视频数据。Message Type ID为15-20的消息用于发送AMF编码的命令,负责用户与服务器之间的交互,比如播放,暂停等等。消息首部(Message Header)有四部分组成:标志消息类型的Message Type ID,标志消息长度的Payload Length,标识时间戳的Timestamp,标识消息所属媒体流的Stream ID。消息的报文结构如下图所示:2.2.3 消息分块
在消息被分割成几个消息块的过程中,消息负载部分(Message Body)被分割成大小固定的数据块(默认是128字节,最后一个数据块可以小于该固定长度),并在其首部加上消息块首部(Chunk Header),就组成了相应的消息块。消息分块过程如图5所示,一个大小为307字节的消息被分割成128字节的消息块(除了最后一个)。2.2.4 消息格式简单图解
总结以上三个图,消息格式大致可以用以下图描述: