rmtp流中对音频数据头的解析。

rtmp 对消息的封装是通过chunk地方式来确定的。其中在msg id == 0x08表示音频,就是说后面带的消息是音频数据。那么,这个音频数据是什么格式呢?今天也是第一次碰到这个问题。记录下



有下面的数据

00000000  04 00 02 80 00 00 76 08  01 00 00 00 80 79 1b  
00000010  78 29 ed 98 29 2d 7e 95  3b 9c 1b 9f aa 3a f7 44 
00000020  72 78 1a 9a dc 3c 6c 07  41 18 b9 d7 5b f9 ec e6  
00000030  c7 51 a1 ca be 49 c4 22  c7 84 41 d0 b7 1a a1 ce 
00000040  1d e1 12 12 2b df c9 ba  ce ec 02 36 bb fe ca a8 
00000050  f9 b9 0c 2b e8 0c c8 62  cc b7 29 81 b0 07 4f 02  
00000060  47 f0 16 37 73 4e be f3  bc bd 88 35 70 77 30 6e 
00000070  4e cc e2 53 24 d0 26 05  da c0 8c 71 c8 1d fb 59  
00000080  8e 27                                          

第一个字节 04  高两位位  0,表示chunk 类型为0,就是最全的类型。剩下的四位位 4,是chunk id ,表示音视频通道。这个id目前用到了2-7,具体作用如下:


02    Ping 和ByteRead通道 
03   Invoke通道 我们的connect() publish()和自字写的NetConnection.Call() 数据都是在这个通道的 
04   Audio和Vidio通道 
05   06 07 服务器保留,经观察FMS2用这些Channel也用来发送音频或视频数据 


ok,既然是最全的数据,那么后面接到的应该是3个字节的时间diff,3个字节的长度,一个字节的msg id,还有4个字节的流id,按照这个分析如下

time diff  00 02 80  

length    00 00 76 

msg id 08       

stream id 01 00 00 00


msgid ==0x 08 表示的音频数据。具体各个id表示的含义如下

0×01  Chunk Size changes the chunk size for packets 
0×02  Unknown 
0×03  Bytes Read send every x bytes read by both sides 
0×04  Ping ping is a stream control message, has subtypes 
0×05  Server BW the servers downstream bw 
0×06  Client BW the clients upstream bw 
0×07  Unknown 
0×08  Audio Data packet containing audio 
0×09  Video Data packet containing video data 
0x0A-0x0E Unknown 
0x0F  FLEX_STREAM_SEND TYPE_FLEX_STREAM_SEND 
0x10  FLEX_SHARED_OBJECT TYPE_FLEX_SHARED_OBJECT 
0x11  FLEX_MESSAGE TYPE_FLEX_MESSAGE 
0×12  Notify an invoke which does not expect a reply 
0×13  Shared Object has subtypes 
0×14  Invoke like remoting call, used for stream actions too. 
0×16  StreamData 这是FMS3出来后新增的数据类型,这种类型数据中包含AudioData和VideoData 


现在到具体的分析要点了。这个音频数据的格式是啥呢?

关键是第一个字节表示了音频格式。那么这个0x80到底表示什么呢?

rmtp协议是这么规定音频数据的

0000          00                0               0

音频编码   采样率      8/16位       1/2通道


音频编码规定为

 rmtp流中对音频数据头的解析。_第1张图片

rmtp流中对音频数据头的解析。_第2张图片

那么,0x80 == 1000 00 0 0 

表示g711编码的 5.5k采样率的 8位的单声道的音频数据。

好复杂。

另外,对应aac,还需要另外三个字节来表示如下

rmtp流中对音频数据头的解析。_第3张图片


具体含义如下

rmtp流中对音频数据头的解析。_第4张图片


真是越分析越复杂。


下面来分析下对应视频的数据。

视频数据对应的tag规定如下

rmtp流中对音频数据头的解析。_第5张图片


下面是具体化到h264的格式

rmtp流中对音频数据头的解析。_第6张图片


各个位的具体含义为

rmtp流中对音频数据头的解析。_第7张图片

视频数据今天没哟遇到问题。就不在分析了。


推荐一个链接。讲的很清楚

点击打开

详细文档

点击打开链接





你可能感兴趣的:(rtmp)