rtmp flv协议笔记

来源:互联网 发布:淘客积分软件 编辑:程序博客网 时间:2024/05/18 06:53

rtmp协议格式:
RTMP — Real Time Messaging Protocol,TCP/IP五层体系结构中应用层协议(流媒体协议),基于TCP传输,在TCP通道上传输命令和数据,一般传输的是 flv,f4v 格式流。
RTMP协议中基本的数据单元称为消息(Message),消息会被拆分成更小的单元,称为消息块(Chunk),以适合在相应的网络环境上传输。

RTMP发送端首先把媒体数据封装成消息,然后把消息分割成消息块,最后将分割后的消息块通过TCP协议发送出去。
接收端通过TCP协议收到数据后,首先把消息块重新组合成消息,然后通过对消息进行解封装处理就可以恢复出媒体数据,然后再去做其它进行相应。

librtmp:
RTMP_SetupURL():设置会话。
RTMP_Connect(): 建立网络连接(NetConnection)
RTMP_ConnectStream():建立网络流(NetStream,可以有多个NetStream)

1、
message:
message header + message body

message header:
head type + time stamp + playload length + message type id + stream id

messag type: 不同种类的消息包含不同的messag type id,代表不同的功能,RTMP协议中一共规定了十多种消息类型,有着不同的作用。
ID在1-7的消息用于协议控制,一般是RTMP协议自身管理要使用的消息
ID为8,9的消息分别用于传输音频和视频数据。
ID为15-20的消息用于发送AMF编码的命令,负责用户与服务器之间的交互,比如播放,暂停等

2、
chunk: RTMP是按照chunk size对message body进行分块,chunk size指的是chunk的payload(即chunk data)部分的大小,
chunk header + chunk data(默认128字节大小)

chunk header:
chunk basic header + chunk message header + extended timestamp

如:360 字节的消息被分割成128字节的消息块,360 = 2 × 218 + 104,则该message可分为3个chunk,而且最后一个chunk的 chunk data只有104字节

flv协议格式:
音视频RTMP消息的payload中都放的是FLV-TAG格式封装的音视频

flv文件主要由两部分组成:
header + body
header: flv的类型、版本等信息,是flv的开头,一般都差不多,占9bytes

body:
由一个个Tag组成,每个Tag的下面有一块4bytes的空间,用来记录这个tag的长度

Tag:
Tag Header + Tag Data

Tag Header: 存放当前Tag的类型、数据区(Tag Data)长度等信息, 11 bytes
名称 长度 内容
Tag类型 1 bytes 8:音频
9:视频
18:脚本
其他:保留
数据区长 3 bytes 数据区的长度
时间戳 3 bytes 整数,单位是毫秒。对于脚本型的tag总是0
时间戳扩展 1 bytes 将时间戳扩展为4bytes,代表高8位。很少用到
StreamsID 3 bytes 总是0
数据区(data) 由数据区长度决定 数据实体

Tag Data:音频数据、视频数据、脚本数据
Audio Tag:
音频参数(8bits):
音频格式(4bits, SourceFormat=10, aac则包含AACPacketType字节等)、采样率(2bits)、采样的长度(1bit)、音频类型(1bit)

AACPacketType(8bits, 包的类型):
AACPacketTyp e= 0x00,AAC sequence header(即对应AudioSpecificConfig结构信息);
AACPacketType = 0x01,AAC raw;

CompositionTime(24bits 相对时间戳):
AACPacketType = 0x01,相对时间戳;
其它,均为0x00;

Data(负载数据):
AACPacketType = 0x00,Data为AudioSpecificConfig;
AACPacketType = 0x01,Data为AAC raw;

AudioSpecificConfig:
(AAC Profile 5bits | 采样率 4bits | 声道数 4bits | 其他 3bits |)
5bits baudioObjectType
4bits samplingFrequencyIndex
4bits channelConfiguration
1bit frameLengthFlag
1bit dependsOnCoreCoder
1bit extensionFlag

Video Tag:
视频参数(8bits):
帧类型(4bits)、编码ID(4bits,CodecID=7,则包含AVCPacketType 字节等)

AVCPacketType (8bits, 包的类型):
AVCPacketType = 0x00,AVC Sequence Header(即对应AVCDecorderConfigurationRecord结构信息);
AVCPacketType = 0x01,AVC NALU;
AVCPacketType = 0x02,AVC end ofsequence

CompositionTime(24bits 相对时间戳):
AVCPacketType = 0x01,相对时间戳;
其它,均为0x00;

Data(负载数据):
AVCPacketType = 0x00,Data为AVCDecorderConfigurationRecord;
AVCPacketType = 0x01,Data为NALUs;
AVCPacketType = 0x02,Data为空。

AVCDecorderConfigurationRecord 具体格式如下:
| cfgVersion(8) | avcProfile(8) | profileCompatibility(8) | avcLevel(8)
| reserved(6)
| lengthSizeMinusOne(2)
| reserved(3)
| numOfSPS(5) |spsLength(16) | sps(n) | numOfPPS(8) | ppsLength(16) | pps(n) |

0 0