流媒体ios视频直播rtmp协议详解

RTMP协议 02 视频Chunk和音频Chunk到底长啥样?

2017-06-03  本文已影响330人  FlyingPenguin

重要概念

RTMP Chunk Header

RTMP Chunk Header的长度不是固定的,分为: 12 Bytes、8 Bytes、4 Bytes、1 Byte 四种,由RTMP Chunk Header前2位决定。

chunk type 与 chunk header length的对应关系 RTMP Chunk Header (12 Bytes) RTMP Chunk Header (8 Bytes) RTMP Chunk Header (4 Bytes) RTMP Chunk Header (1 Byte)

详见RTMP Chunk Header

FLV VideoTagHeader
VideoTagHeader

分析RTMP流时,经常看到与0x170x27进行比较的情况,那0x170x27究竟是什么东东呢?

FLV AudioTagHeader
AudioTagHeader Part 1
AudioTagHeader Part 2

AudioTagHeader的长度为2个字节。
AAC的前4个比特是:二进制的1010,即10进制的10。
AAC时,第二个字节用于指定包的类型(AACPacketType)。
如果AACPacketType = 0,则是AAC Sequence header(解码信息);
如果AACPacketType = 1,还是AAC raw(原始音频数据)。

AACPacketType = 0
AAC Sequence header
AACPacketType = 1
AAC raw

RTMP层次(数据发送角度)

RTMP层次(数据发送角度)

H.264的NALU是如何一步步变成RTMP Video Chunk的呢?
AAC的ADTS是如何一步步变成RTMP Audio Chunk的呢?

RTMP Video Chunk (H.264/AVC)

RTMP Video Chunk (H.264/AVC) 封装过程简图
RTMP Video Chunk (H.264/AVC) 封装过程简图
RTMP Video Chunk (H.264/AVC) 封装过程详图
RTMP Video Chunk (H.264/AVC) 封装过程详图
0500000000003f0901000000 // 12字节的RTMP Chunk Header
17  // 1: keyframe 7:AVC 表示是AVC的关键帧
00  // 0x00: 表明当前Packet的类型是 AVC sequence header
000000 // 3字节的Composition Time
// 以下(到结尾)为实际的AVC sequence header
01 // AVC sequence header的开始 固定为0x01
4d // H.264的profile 0x4d即十进制的77 表示是 Main Profile
40
28 // H.264的level
ff
e1 // 即二进制11100001 后5位为SPS的格式 即1
002b // 2个字节 SPS的长度  即十进制的43
// 实际的SPS 以0x67开头
674d4028965200f0044f
cbff88700b4008000003
00080000030197010003
e800000fa00fe31c0da1
62d920
// 一个字节 PPS的个数 
01
// PPS的长度
0004
// 实际的PPS 以0x68开头
68eb7352

AVC sequence header的相关知识详见: AVC sequence header & AAC sequence header

050000000009590901000000  // 12字节的RTMP Chunk Header
17 // 1: keyframe 7:AVC 表示是AVC的关键帧
01 // 0x01: 表明当前Packet的类型是 NALU
000078
000000020910
// 4个字节 SPS的长度
0000002b
// 实际的SPS 以0x67开头
674d4028965200f0044f
cbff88700b4008000003
00080000030197010003
e800000fa00fe31c0da1
62d920
// 4个字节 PPS的长度
00000004
68eb7352 // 实际的PPS
00000016
06000980009e34000003000040010500000300002880
000008f9 // 关键帧的数据长度(从后续一直到结尾)
658880400afec077814b449b525dc855ff7a0ea8aad586c5
00000300000300000300000300003ebfcc2647000003000
0145000000898000004dc0000030350000003032400000
3038800000303f8000004c80000086800001010000018a
000003b0000030000030000030000030000030000
... // 由于数据量比较大 此处略去若干字节

RTMP Audio Chunk (AAC)

RTMP Audio Chunk (AAC) 封装过程 RTMP Audio Chunk (AAC) 举例

References:

https://my.oschina.net/u/1983790/blog/686521?p=%7B%7BcurrentPage-1%7D%7D
video_file_format_spec_v10_1.pdf

上一篇 下一篇

猜你喜欢

热点阅读