目录
1 rtmp格式
2 header
3 chunk data
1 rtmp格式
Real Time Messaging Protocol(实时消息传送协议协议)是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议。 在RTMP协议中信令和媒体数据都称之为Message,包含Message head。RTMP协议是基于TCP的,直播最低延时通常3秒左右。由于TCP的包长度受限于MTU(1500个字节),而RTMP的Message长度可能超过MTU,会采取分片,将消息体拆分成多个chunk data
RTMP 协议来的传输单元是 chunk。一个 RTMP 包就是一个 chunk。RTMP消息组成:包头,包体。包头可以是4种长度的任意一种:12, 8, 4, 1 byte(s).完整的RTMP包头应该是12bytes,包含了时间戳,AMFSize,AMFType,StreamID信息, 8字节的包头只纪录了时间戳,AMFSize,AMFType,其他字节的包头纪录信息依次类推 。包体最大长度默认为128字节,通过chunkSize可改变包体最大长度,通常当一段AFM数据超过128字节后,超过128的部分就放到了其他的RTMP封包中。
RTMP 协议最多支持 65597 个流(chunk)。
2 header
chunk header中Chunk stream ID 是用来区分消息信道的。CS ID(块流ID) 范围为: 3 ~ 65599。
Adobe建议的CS ID设置
AMFType消息类型
StreamID
StreamID是音视频流的ID,如果AMFType!=0x08或!=0x09那么 StreamID为0。
ChannelID 和StreamID之间的计算公式:StreamID=(ChannelID-4)/5+1 参考red5
例如当ChannelID为2、3、4时StreamID都为1当ChannelID为9的时候StreamID为2
基本头分为三种情况由Base Header第一个字节后六个bits决定
(后六个bits==0):基本头长度为2字节第二个字节表示块流ID
(后六个bits==1):基本头长度为3字节,第二三个字节表示快流ID
(1<后六个bits<=64):基本头长度为1字节,后6bits表示块流ID
3 chunk data
如果 AMFType = 0×09, 数据就是 Video Data。Video Data由多个video tag组成,一个video tag,包含:SPS,PPS,访问单元分隔符,SEI,I帧包
VideoTagHeader结构
AVCPacketType表示 VIDEODATA
IF AVCPacketType ==0 AVCDecoderConfigurationRecord(AVC sequence header)//包含sps,pps等信息。解码器stop之后再次start之前,如seek、快进快退状态切换等,都需要重新送一遍sps和pps的信息。AVCDecoderConfigurationRecord在FLV文件中一般情况也是出现1次,也就是第一个 video tag.
IF AVCPacketType == 1 One or more NALUs (Full frames are required)