在介绍主要内容之前,先介绍一下当前各协议的应用场景
RTMP:一般用作直播,允许丢包
RTSP:一般用作安防,不允许丢包
RTP:一般用作音视频通话,允许丢包,低延迟
HLS:即Http Live Stream,苹果公司封装的基于http协议的直播协议
然后介绍一下短视频和直播的区别:短视频和直播都要控制数据量的大小,可以根据其特点和应用场景调整参数。
短视频:根据其对实时性无要求,对帧率要求较高,不能出现卡顿掉帧的情况。可以拉长I帧间隔,即gop间距尽量大,同时增大码率
直播:根据其对实时性要求高,如中途进入直播间的观众,要尽快出现I帧让用户能看到图像,不能让观众等待太久,而丢失部分帧并不影响观看效果。可以减少I帧间隔,即gop间距尽量小,同时减小码率
下面开始正式内容,介绍rtmp协议数据传输格式:
对http协议有了解的大概都知道,http协议无论是get、post、put、delate方式,只是通过设定数据的不同位置和不同格式产生不同的请求效果
rtmp如是,其他任何一种协议也如是,都是设定了一套数据传输格式,并给他起名,作为一种数据传输标准
当然,这里会介绍通过rtmp协议发送h264视频数据sps/pps、I帧、p/b帧和aac音频数据,h265同样,丢弃其中的vps即可
一、视频数据:
我们知道,在h264视频中,帧数据类型是分隔符(即:00 00 01 或00 00 00 01) 后一个字节数据的后5位
sps数据正常情况下为0x67
pps数据正常情况下为0x68
I帧数据正常情况下为0x65
...
取后5位,即:
sps类型: 0x67 & 0x1F = 7
pps类型: 0x68 & 0x1F = 8
I帧类型: 0x65 & 0x1F = 5
分离h264中的各类型帧的数据,只需根据类型进行切割即可,本章不做介绍。
为了方便解说,我列了一个表
字节索引 | 0 | 1 | 2 | 3 | 4 | ... |
---|---|---|---|---|---|---|
sps pps | 0x17 | 0x00 | 0x00 | 0x00 | 0x00 | ... |
关键帧(I帧) | 0x17 | 0x01 | 0x00 | 0x00 | 0x00 | ... |
非关键帧(p/b帧) | 0x27 | 0x00 | 0x00 | 0x00 | 0x00 | ... |
可以看到,前5个字节中,sps pps数据第一个字节和I帧第一个字节是相同,不同之处在于第二个字节,I帧使用0x01,sps pps 使用0x00, p/b帧则第一字节使用0x27
下面分别从第5位索引开始介绍各帧类型的数据格式
sps pps帧:
字节索引 | 占用字节 | 数据 | 含义 |
---|---|---|---|
5 | 1 | 0x01 | 版本号 |
6 | 1 | sps[1] | 即0x67后面一位的字节 |
7 | 1 | sps[2] | 即0x67后面第二位的字节 |
8 | 1 | sps[3] | 即0x67后面第三位的字节 |
9 | 1 | 0xff | 恒定值 |
10 | 1 | 0xe1 | sps个数(即0xe1 & 0x1f = 1)恒定值 |
11 | 1 | (spsLen >> 8) & 0xff | sps长度,使用两个字节存储 |
12 | 1 | len & 0xff | |
13...13+spsLen-1 | spsLen | sps内容 | sps内容 |
13+spsLen | 1 | 0x01 | pps个数 |
13+spsLen+1 | 1 | (ppsLen >> 8) & 0xff | pps长度,使用两个字节存储 |
13+spsLen+2 | 1 | ppsLen & 0xff | |
13+spsLen+3...13+spsLen+3+ppsLen-1 | ppsLen | pps内容 | pps内容 |
I/P/B帧:
字节索引 | 占用字节 | 数据 | 含义 |
---|---|---|---|
5 | 1 | (frameLen >> 24) & 0xff | 帧数据长度,使用4个自己存储 |
6 | 1 | (frameLen >> 16) & 0xff | |
7 | 1 | (frameLen >>8) & 0xff | |
8 | 1 | frameLen & 0xff | |
9...9+frameLen-1 | 1 | frame数据内容 | 帧数据内容 |
以上表格中,spsLen为sps去除00 00 00 01后的数据长度,ppsLen为pps去除00 00 00 01后的数据长度,frameLen为I/P/B帧去除00 00 00 01后的数据长度。
二、音频数据:
音频数据相对简单,不过需要分为两步
第一步:告诉播放端,我要开始发送音频了
第二步:音频数据
同样,列表说明
告诉播放端要开始发送音频数据了:
数据索引 | 占用字节 | 数据 |
---|---|---|
0 | 1 | 0xaf |
1 | 1 | 0x00 |
2 | 1 | 0x12 |
3 | 1 | 0x08 |
发送音频数据:
数据索引 | 占用字节 | 数据 |
---|---|---|
0 | 1 | 0xaf |
1 | 1 | 0x01 |
2...2+audioLen-1 | audioLen | 音频数据内容 |
以上表格中,audioLen为音频采样数据长度。
以上内容即为RTMP协议数据解析全部内容,本章内容结束。