多媒体格式标准、H264 编码与 MP4 格式简要介绍
1.标准概括
1.1.MPEG-1
主要用于 CD / VCD 光盘时代的音视频压缩。
MPEG-1可以按照分层的概念来理解,一个MPEG-1视频编码序列分为三个层次,从顶层到最底层依次是:
- 图像组层(GOP: Group of Picture)
- 帧层(frame),每个 GOP 可以包含多个 frame
- 像条层(slice),每个 frame 可以包含多个 slice
MPEG-1 定义的帧种类:
- I-图像/帧(节点编码图像,intra coded picture)参考图像,相当于一个固定影像,且独立于其它的图像类型。每个图像组群由此类型的图像开始。编码时独立编码,仅适用帧内编码技术,因而解码时不参考其他帧,类似JPEG编码。
- P-图像/帧(预测编码图像,predictive coded picture)包含来自先前的I或P-画格的差异信息。编码时使用运动补偿和运动估计,采用前向估计,参考之前的I-帧或者P-帧去预测该P格。
- B-图像/帧(前后预测编码图像,bidirectionally predictive coded pictures)包含来自先前和/或之后的I或 P-画格的差异信息。编码也使用运动补偿和运动估计,预估采用前向估计、后向估计或是双向估计,主要参考前面的或者后面的I格或者P格。
- D-图像/帧(指示编码图像,DC direct coded picture)用于快速进带。仅由DC直流分量构造的图像,可在低比特率的时候做浏览用。实际编码中很少使用。
1.2.MPEG-2
MPEG-2 是 DVD 和数字电视广播时代产生的音视频编码标准,但也被应用于后来的高清电视(HDTV)和蓝光光盘。
MPEG-2 的编码码流分为六个层次,从顶层到最底层依次是:
- 视频序列层(Sequence)
- 图像组层(GOP: Group of Picture)
- 图像层(Picture)
- 像条层(Slice)
- 宏块层(Macro Block)
- 像块层(Block)
1.3.MPEG-3
MPEG-3是MPEG组织制定的视频和音频压缩标准。本来的目标是为HDTV提供20-40Mbps视频压缩技术。在标准制定的过程中,委员会很快发现MPEG-2技术足以获取类似的效果,因此将其合并到MPEG-2,成为MPEG-2的延伸。
MP3 vs MPEG-3
MP3 是 MPEG-1 音频 Layer-3 部分,MPEG-1 的音频格式有 3 代,MP3 是第三代。
MPEG-3 是音视频标准,目前已经属于 MPEG-2 的一部分。
1.4. MPEG-4
MPEG-4 是由一系列标准组成
第一部分(ISO/IEC 14496-1):系统:描述视频和音频数据流的控制、同步以及混合方式(即混流Multiplexing,简写为MUX)。
第二部分(ISO/IEC 14496-2):视频:定义一个对各种视觉信息(包括自然视频、静止纹理、计算机合成图形等等)的编解码器。(例如XviD编码就属于MPEG-4 Part 2)
第三部分(ISO/IEC 14496-3):音频:定义一个对各种音频信号进行编码的编解码器的集合。包括高级音频编码(Advanced Audio Coding,缩写为AAC)的若干变形和其他一些音频/语音编码工具(如Audio Lossless Coding,缩写为ALS)。
第四部分(ISO/IEC 14496-4):一致性:定义对本标准其他的部分进行一致性测试的程序。
第五部分(ISO/IEC 14496-5):参考软件:提供用于演示功能和说明本标准其他部分功能的软件。
第六部分(ISO/IEC 14496-6):多媒体传输集成框架(DMIF for Delivery Multimedia Integration Framework)
第七部分(ISO/IEC 14496-7):优化的参考软件:提供对实现进行优化的例子(这里的实现指的是第五部分)。
第八部分(ISO/IEC 14496-8):在IP网络上传输:定义在IP网络上传输MPEG-4内容的方式。
第九部分(ISO/IEC 14496-9):参考硬件:提供用于演示怎样在硬件上实现本标准其他部分功能的硬件设计方案。
第十部分(ISO/IEC 14496-10):高级视频编码或称高级视频编码(Advanced Video Coding,缩写为AVC):定义一个视频编解码器(codec)。AVC和XviD都属于MPEG-4编码,但由于AVC属于MPEG-4 Part 10,在技术特性上比属于MPEG-4 Part2的XviD要先进。另外,它和ITU-T H.264标准是一致的,故又称为H.264。
第十二部分(ISO/IEC 14496-12):基于ISO的媒体文件格式:定义一个存储媒体内容的文件格式。
第十三部分(ISO/IEC 14496-13):知识产权管理和保护(IPMP for Intellectual Property Management and Protection)拓展。
第十四部分(ISO/IEC 14496-14):MPEG-4(即MP4)文件格式:定义基于第十二部分的用于存储MPEG-4内容的视频文档格式。
第十五部分(ISO/IEC 14496-15):AVC文件格式:定义基于第十二部分的用于存储第十部分的视频内容的文件格式。
第十六部分(ISO/IEC 14496-16):动画框架扩展(AFX : Animation Framework eXtension)。
第十七部分(ISO/IEC 14496-17):同步文本字幕格式。
第十八部分(ISO/IEC 14496-18):字体压缩和流式传输(针对开放字体格式Open Font Format)。
第十九部分(ISO/IEC 14496-19):合成材质流(Synthesized Texture Stream)。
第二十部分(ISO/IEC 14496-20):简单场景表示(LASeR for Lightweight Scene Representation。
第二十一部分(ISO/IEC 14496-21):用于描绘(Rendering)的MPEG-J拓展。
第二十二部分(ISO/IEC 14496-22):开放字体格式(Open Font Format)。
第二十三部分(ISO/IEC 14496-23):符号化音乐表示(Symbolic Music Representation)。
第二十四部分(ISO/IEC 14496-24):音频与系统交互作用(Audio and systems interaction)。
第二十五部分(ISO/IEC 14496-25):3D图形压缩模型(3D Graphics Compression Model)。
第二十六部分(ISO/IEC 14496-26):音频一致性检查:定义测试音频数据与ISO/IEC 14496-3是否一致的方法(Audio conformance)。
第二十七部分(ISO/IEC 14496-27):3D图形一致性检查:定义测试3D图形数据与ISO/IEC 14496-11:2005, ISO/IEC 14496-16:2006, ISO/IEC 14
几个重点:
- 音视频编码:第二部分(ISO/IEC 14496-2)/第三部分(ISO/IEC 14496-3)(MPEG4 编码)、第十部分(ISO/IEC 14496-10)(H.264)
- 网络传输:第八部分(ISO/IEC 14496-8)
- MP4文件格式:第十四部分(ISO/IEC 14496-14)
1.4.1.MP4 vs MPEG-4
MP4或称MPEG-4第14部分(英语:MPEG-4 Part 14)是一种标准的数字多媒体容器格式。MPEG-4第14部分的扩展名为.mp4,以存储数字音频及数字视频为主,但也可以存储字幕和静止图像。因其可容纳支持比特流的视频流(如高级视频编码),为流媒体。
MPEG-4 是一系列用来定义音频、视频的标准集
1.5.视频编码标准的演变
- H.261: 视频电话
- MPEG-1: VCD
- H.262: 数字电视 / DVD
- H.263/H.263+/H.263++:通讯类应用,如视频会议,支持多种网络(PSTN, mobile, LAN/Internet),对丢包/出错场景的兼容性更高
- MPEG-4:基于目标编码,形状编码
- H.264 / AVC Coding:多种使用场景,有线/无线广播、DVD/蓝光存储、视频会议、流式多媒体、多媒体消息(MMS)。因此支持各种读取方式支持顺序/随机,高/低比特率,高/低网络延迟,高/低丢包等情景。
2.H.264.第十部分(ISO/IEC 14496-10)
2.1.架构
分层设计:
- Network Abstraction Layer (NAL):视频和 metadata 格式化进行各种网络适配
- Video Coding Layer (VCL):视频编码层
主要步骤:
- 压缩:预测(帧内预测/帧间预测),DCT转换和量化,比特流编码,结果是编码的 Macroblock
- 切分数据:分片,切分
- 封装:包装 NAL
2.2. NAL
主要目标定义如何把视频数据在不同的网络上进行传输
- RTP/IP:互联网广播
- MPEG-2:广播服务流
- ISO 文件:存储应用(光盘)
NALU 按内容进行分类:
- VCL unit:视频图像
- 头信息块(A类):包括宏块类型,量化参数,运动矢量
- 帧内编码信息块(B类):包含帧内编码宏块类型,帧内编码系数
- 帧间编码信息块(C类):包含帧间编码宏块类型,帧间编码系数
- Non-VCL unit:metadata 等信息
- Parameter sets:被 VCL NAL units 共享的数据头信息
- picture parameter set (PPS): 图像参数集,PPS对如熵编码类型、有效参考图像的数目、初始化量化参数、去方块滤波系数等解码参数进行标志记录。一个 VCL 包含一个自己的 picture parameter set 指向对应 PPS Non-VCL unit 的指针。
- sequence parameter set (SPS): 序列参数集,SPS对如标识符、帧数以及参考帧数目、解码图像尺寸和帧场模式等解码参数进行标识记录。每个 picture parameter set 指向 sequence parameter set
- Supplemental Enhancement Info (SEI):用于提高播放质量(rate-distortion等),非必需的,扩展性强(应用程序可扩展)
- Parameter sets:被 VCL NAL units 共享的数据头信息
NALU 传输分类:
- 基于流(stream-oriented):需要使用 Start Code prefix (00 00 00 01 或 00 00 01)
- 基于包(packet-oriented):不需要使用 Start Code prefix
编码: H.264 NALU 单元常由[Start Code] [NALU Header] [NALU Payload] 三部分组成
- Start Code: 表示 NALU 开始,必须是 00 00 00 01 或 00 00 01
- NALU Header:1 个字节
- NALU Payload:内容
访问(Access Units):
一组可以解码成图像的 NALU 被称为 Access Units
- Delimiter: 定位
- SEI:时间和其他信息
- Primary coded picture: VCL
- Redundant coded picture:主码解码错误后进行错误修复
2.3. VCL
2.3.1.图像表示方法概念
宏块 Macroblock(MB):
- 亮度宏块(luma):大小 16x16,1个
- 色差宏块(chroma):大小 8x8,2个,与 primary colors 的色差分量 Cb, Cr。
片(slice):
slice是 一组 MB 构成的集合,一个 slice 可以不需要别的 slice 参与进行独立解码,可以分为以下几类:
- I-slice: 帧内预测 (I-MB)
- P-slice: 帧间预测 (I- and P-MBs)
- B-slice: 双向帧间预测 (I- and B-MBs)
- SP-slice: 在不同码流间切换
- SI-slice: 与 SP-slice 一起在不同码流间切换
灵活的宏块顺序 (Flexible Macroblock Order - FMO):
- 在 slice 内部 macroblock 按照栅格顺序排列
- slice group:包含一个或多个 slice
图像(Picture):
一个图像通常对应一帧(Frame)或两场(Field)
帧(Frame):
一个帧包含 1 个亮度分量和 2 个色差分量
分类:
- I帧(Intra coded frame/关键帧)
- 普通 I 帧:所有 MB 采用帧内预测方式,仅用 I 帧就可以解码出完整图像
- 作为P帧/B帧的参考帧
- 可以作为快进/快退的参考点
- IDR 帧:立即刷新图像缓冲区,从 IDR 可以重新开始一个序列(Sequence),IDR 之后的 P帧/B帧都不能参考之前的帧
- 主要用于随机播放
- 普通 I 帧:所有 MB 采用帧内预测方式,仅用 I 帧就可以解码出完整图像
- P帧:前向预测帧间编码帧,参考前面靠近的 I 帧和 P 帧
- P 帧可以作为后续 P 帧的参考帧(如果中间出现错误会传递扩大)
- B帧:双向预测帧间编码帧,参考前面靠近的 I 帧和 P 帧和后面的 P 帧
- 在更早的标准中(如 MPEG-2)不作为参考帧
- 在 H.264 中可以作为参考帧
- SI帧:用于不同编码流之间的切换
- SP帧:用于不同编码流之间的切换
“帧”与“片”与“宏块”
帧/片类型 | 宏块 |
---|---|
I frames/slices (Intra) | I宏块 |
P frames/slices (Predicted) | I宏块、P宏块 |
B frames/slices (Bi-Predicted) | I宏块、B宏块 |
SI-frames/slices (switching I) | SI宏块(一种特殊的帧内编码宏块),用于不同编码流之间的切换 |
SP-frames/slices (switching P) | I宏块、P宏块,用于不同编码流之间的切换 |
场/帧场(Field):
帧内交替行(奇偶行)的集合,一个帧由顶场(Top Field)/底场(Bottom Field)组成,每个场可以在不同的时间拍摄(Interlaced)
Top field Top field
Bottom field Bottom field
^ ^
| frame |
^ ^
| frame |
Field 编码成 Frame 有几种方式:
- frame mode: 只用单个 frame
- field mode: 2 个 field 组成一个 frame
- mixed mode (adaptive): 自适应的决定使用 frame mode 或 field mode
自适应 (adaptive mode) 可以分两种:
- PAFF (Picture-Adaptive frame/field)
- 在 frame 级别进行判定使用 frame / field mode
- 比使用 frame mode 提高 16-20% 压缩率
- MBAFF (Macroblock-adaptive frame/field)
- 在 MB 级别进行判定使用 frame / field mode
- 比 PAFF 进一步提高 14-16% 压缩率
题外话:过去的阴极射线电视机在帧率接近电影的帧率时图像会过快消失,所以采用隔行扫描形式组成 1 帧,同时可以降低数据带宽。
2.3.2.帧内预测 (Intra-frame Prediction)
使用一个 MB 左边及上边的 MB 进行预测。
预测类型:
- Intra_4x4: detailed luma blocks
- Intra_16x16: smoothed luma blocks
- Chroma_8x8: 色差比较平滑
- I_PCM: 忽略 prediction/transform,适用于不规则的图像、或者无损的图像、或者需要进行确定性 bit-rate 的场景
2.3.2.1.Intra_4x4
预测模式:
- 1 个 DC 模式
- 8 个方向模式
2.3.2.2.Intra_16x16
预测模式:
- Vertical
- Horizontal
- DC
- Planar (Diagonal)
2.3.3.Inter-Prediction in P slices
2.3.3.1.切分 MB
按照亮度和色差切分
2.3.4.Multiframe Inter-Prediction in B slices
2.4.码流结构
经过 VCL 编码后生成的 NALU 原始数据会被分包,因为 NALU 的 Start Code 是 00 00 00 01 或 00 00 01,因此在 NALU 数据中也可能存在冲突,解决办法是引入 EBSP
几个概念:
- SODB:String of Data Bits,原始数据比特流,是最原始的编码压缩后的数据
- RBSP:Raw Byte Sequence Payload,原始字节序列载荷,对 SODB 进行 8 位补齐
- RBSP = SODB + RBSP Trailing Bits
- EBSP:Encapsulated Byte Sequence Payload,扩展字节序列载荷,在 RBSP 中引入防竞争字节(0x03),在 RBSP 中如果出现了连续两个 00 字节,就在后面添加一个防竞争字节(0x03)
2.5.Profiles and Applications
主要目的是定义编码工具和算法
3 个 Profile:
- Baseline: 主要用于视频会议
- Main: 广播、媒体存储、数字影院
- Extended: IP 网络流媒体
3.网络传输: 第八部分(ISO/IEC 14496-8)
这个标准定义了以下内容:
- 在 IP 网络上传输 ISO/IEC 14496 内容的框架
- 在 RTP 中分片/组装负载的指导方法
- 使用 SDP (Session description protocol) 传输 ISO/IEC 14496-1 内容
- ISO/IEC14496 相关的 MIME type
- RTP 安全和多播
3.1. RTP
RTP 负载分片/组装规则
3.1.1. RTP 传输 H.264
H.264 NALU
H.264 NALU 单元常由[Start Code] [NALU Header] [NALU Payload] 三部分组成
- Start Code: 表示 NALU 开始,必须是 00 00 00 01 或 00 00 01
- NALU Header:1 个字节
- NALU Payload:内容
NALU (Header + Payload)
一个 NALU 的封装形式如下,包含了 NALU Header 及 NALU Payload
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|F|NRI| type | |
+-+-+-+-+-+-+-+-+ |
| |
| Bytes 2..n of a Single NAL unit |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
NALU Header:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
- F: 1 bit
forbidden_zero_bit,h264语法规定值为0。rtp封包中,当检测到值为1时,则表示该nalu中已出现错误。
NRI: 2 bits nal_ref_idc, 参考级别,当值为00时,表示后面的负载可以丢弃,并不会影响正常解码,当大于00时后面的该包丢弃会影响解码,不可丢弃。rtp封包中,该值也表示该数据包的重要性,11为重要性最高。
Type: 5 bits
nal_unit_type,nalu的类型,h264文档中定义为
nal_unit_type | 含义 |
---|---|
0 | 未定义 |
1 | 非IDR图像中不采用数据划分的片段 |
2 | 非IDR图像中A类数据划分片段 |
3 | 非IDR图像中B类数据划分片段 |
4 | 非IDR图像中C类数据划分片段 |
5 | IDR图像的片段 |
6 | 补充增强信息 (SEI) |
7 | 序列参数集/SPS |
8 | 图像参数集/PPS |
9 | 分割符 |
10 | 序列结束符 |
11 | 流结束符 |
12 | 填充数据 |
13 – 23 | 保留 |
24 – 31 | 未定义 |
1-23 是 H.264 的标准定义,24 以后 RTP 进行了专有扩展
Type Packet Single NAL Non-Interleaved Interleaved
Unit Mode Mode Mode
-------------------------------------------------------------
0 undefined ig ig ig
1-23 NAL unit yes yes no
24 STAP-A no yes no
25 STAP-B no no yes
26 MTAP16 no no yes
27 MTAP24 no no yes
28 FU-A no yes yes
29 FU-B no no yes
30-31 undefined ig ig ig
1-23 单一时间数据包 (Single NAL unit packet),一个rtp包中只包含一个nalu。
24-25 单一时间组合包(Aggregation packet),一个rtp包含多个同一时间nalu。
26-27 多时间组合包(Aggregation packet),一个rtp包含多个时间片的多个nalu。
28-29 分片组合(Fragmentation unit),多个rtp包才能组合成一个完整的nalu。
#####打包封装:
使用 RTP 打包时会用 RTP 头替换掉 NALU 中开始的 Start Code (00 00 00 01 或 00 00 01)
打包举例,对于如下 NALU
[00 00 00 01 67 42 A0 1E 23 56 0E 2F … ]
使用 RTP 打包成下面的内容:
[RTP Header] [67 42 A0 1E 23 56 0E 2F … ]
几种情况:
- Single NAL unit packet:可以在一个网络包中传输整个 NALU
- Aggregation packet:可以在一个网络包中传输多个 NALU,又可以分为“单一时间组合包”和“多时间组合包”
- Fragmentation unit:无法在一个网络包中传输整个 NALU,可以理解成一个 NALU 长度超过 MTU 减去各种协议头(UDP/TCP/IP/RTP)的长度,需要把一个 NALU 拆分成多个 NAL
单一时间数据包:
当nalu较小,一个rtp包即可传输时,可在单个rtp包中只包含一个nalu,进行发送。
一个rtp中只包含一个nalu,rtp的负载如下
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|F|NRI| type | |
+-+-+-+-+-+-+-+-+ |
| |
| Bytes 2..n of a Single NAL unit |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
单一时间组合包:
nalu较小的情况下,在同一时刻生成了多个nalu,可以使用该打包方式,将多个nalu封装在一个包中。webrtc中sps和pps通常打包在同一个rtp中。
STAP-A 封装格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAP-A NAL HDR | NALU 1 Size | NALU 1 HDR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 1 Data |
: :
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | NALU 2 Size | NALU 2 HDR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 2 Data |
: :
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
STAP-A NAL HDR 中 nalu type取值为24。
相对于单一数据包中,多了一个 NALU Size 字段,表示每个nalu的长度。
STAP-B 封装格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAP-B NAL HDR | DON | NALU 1 Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 1 Size | NALU 1 HDR | NALU 1 Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
: :
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | NALU 2 Size | NALU 2 HDR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 2 Data |
: :
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
STAP-B NAL HDR 中 nalu type取值为25。
相对于STAP-A多了一个DON (decoding order number)字段,既解码顺序,而后续的每个nalu的解码顺序为DON累加1,既nalu 1 解码顺序为DON,而NALU2 为DON+1,NALU3 为(DON +1)+1,以此类推。
多时间组合包:
nalu较小的情况下,在一个rtp包中封装多个不同时间戳的nalu。
MTAP16
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|MTAP16 NAL HDR | decoding order number base | NALU 1 Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 1 Size | NALU 1 DOND | NALU 1 TS offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 1 HDR | NALU 1 DATA |
+-+-+-+-+-+-+-+-+ +
: :
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | NALU 2 SIZE | NALU 2 DOND |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 2 TS offset | NALU 2 HDR | NALU 2 DATA |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
: :
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
MTAP16 NAL HDR 中 nalu type取值为26。
DONB(decoding order number base)表示解码顺序的基数值,DOND 表示与DONB的偏移值。
NALU TS offset ,为nalu原始时间戳与 rtp包头中的timestap的偏移值。
MTAP24
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|MTAP24 NAL HDR | decoding order number base | NALU 1 Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 1 Size | NALU 1 DOND | NALU 1 TS offs |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|NALU 1 TS offs | NALU 1 HDR | NALU 1 DATA |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
: :
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | NALU 2 SIZE | NALU 2 DOND |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 2 TS offset | NALU 2 HDR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 2 DATA |
: :
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
MTAP24 NAL HDR 中 nalu type取值为27。
MATP16与 MTAP24 的区别在于NALU TS offset 值存放空间不同,前者为16bit,而后者为24bit。
分片组合:
当使用udp传输rtp包时,由于一个udp的荷载最大为1480个字节,当一个nalu大于1480时,就需要将一个nalu分割为多个rtp包进行传输,具体的分割方式有以下两种。
FU-A
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FU indicator | FU header | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| FU payload |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
FU-B
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FU indicator | FU header | DON |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
| |
| FU payload |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
其中 FU indicator
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
- F: 1 bit
forbidden_zero_bit,h264语法规定值为0。rtp封包中,当检测到值为1时,则表示该nalu中已出现错误。
- NRI: 2 bits
nal_ref_idc, 当值为00时,表示后面的负载可以丢弃,并不会影响正常解码,当大于00时后面的该包丢弃会影响解码,不可丢弃。rtp封包中,该值也表示该数据包的重要性,11为重要性最高。
- Type: 5bit
rtp包中nalu type,可取值为28(FU-A),29(FU-B)。
- FU header
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|S|E|R| Type |
+---------------+
- S: 1 bit
值为1表示该rtp包为nalu的开始。
- E: 1 bit
值为1表示该rtp包为nalu的结束。
- R: 1 bit
保留字段。
- Type: 5bit
表示h264中的nalu type 可取值1-23。
从分片恢复 NALU header:
nal_unit_type = (fu_indicator & 0xe0) | (fu_header & 0x1f)
一个全局的 NAL RTP 打包结构图如下:
- NALU:主体数据打包进 RTP
- Slice Header: 包含分片类型、分片中的宏块类型、分片帧的数量以及对应的帧的设置和参数等信息
- Slice Data: 宏块信息
- 宏块:宏块类型、预测类型、Coded Block Pattern、Quantization Parameter、像素的亮度和色度数据集等等信息
3.2.SDP (ISO/IEC 14496-1)
使用 SDP 传输 ISO/IEC 14496-1 定义的内容
3.3.MIME type
互联网媒体类型 (Internet media type,也称为 MIME type),给互联网上传输的内容进行分类。
MIME type 格式为:<类型>/<子类型>; [可选参数]
例如:
text/html; charset = UTF-8
video/mp4
以下是常用的视频类 MIME type:
video/mpeg:MPEG-1视频文件
video/mp4:MP4视频文件
video/ogg:Ogg视频文件
video/quicktime:QuickTime视频文件
video/webm:WebM视频文件(基于Matroska基础)
video/x-matroska:Matroska(多媒体封装格式)
video/x-ms-wmv:Windows Media Video视频文件
video/x-flv:Flash Video(FLV档)
4.MP4: 第十四部分(ISO/IEC 14496-14)
MP4 文件由可以嵌套的 box 组成,每个 box 有 header 和 data,header 定义 box 的类型和大小,data 包含数据或者子 box。
一个典型的视频文件格式如下:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 类型 | 描述 |
---|---|---|---|---|---|---|---|---|
ftyp | 数据 box | 描述文件类型、版本等信息 | ||||||
mdat | 数据 box | Media Data 媒体数据 | ||||||
moov | 嵌套 box | Movie box,用来存放每个媒体轨道的描述信息 | ||||||
moov | mvhd | 数据 box | Movie Header box,记录整个媒体文件信息,如创建时间、修改时间、时间度量标尺、时长等 | |||||
moov | udta | 嵌套 box | User Data box,用户自定义信息 | |||||
moov | trak | 嵌套 box | Track box,记录每个轨道的信息 | |||||
moov | trak | tkhd | 数据 box | Track Header box,轨道的头信息,如创建/修改时间、时长、画面宽度/高度等 | ||||
moov | trak | mdia | 嵌套 box | Media box,媒体信息 | ||||
moov | trak | mdia | mdhd | 数据 box | Media Header box,记录创建时间、时长等信息, | |||
moov | trak | mdia | hdlr | 数据 box | Handler Reference box,媒体播放过程信息 | |||
moov | trak | mdia | minf | 嵌套 box | Media Information box | |||
moov | trak | mdia | minf | vmhd | 数据 box | 视频媒体头信息,smhd:针对音频 | ||
moov | trak | mdia | minf | stbl | 嵌套 box | Sample Table box,媒体数据的索引信息,找到视频的帧数据可以从这里获取 | ||
moov | trak | mdia | minf | stbl | stsd | 嵌套 box | sample description, 给出视频、音频的编码、宽高、音量等信息,以及每个sample中包含多少个frame | |
moov | trak | mdia | minf | stbl | stco | 数据 box | chunk offset, chunk(一个chunk 包含多个 sample,一个 sample 对应一帧) 在文件中的偏移 | |
moov | trak | mdia | minf | stbl | stsc | 数据 box | sample-to-chunk, chunk 中包含 sample 的数量 | |
moov | trak | mdia | minf | stbl | stsz | 数据 box | sample size, 每个 sample 的 size 信息 | |
moov | trak | mdia | minf | stbl | stts | 数据 box | time-to-sample,时间戳到 sample 的映射,每个 sample 的时长 | |
moov | trak | mdia | minf | stbl | stss | 数据 box | sync sampel table, 可以随机访问的 sample 列表(记录哪些 sample 是关键帧) | |
moov | trak | mdia | minf | stbl | ctts | 数据 box | 帧解码到渲染的时间差,针对 B 帧 |
5.其他
5.1.MPEG-7
来自 wikipedia: > MPEG-7并不是一个视频压缩标准,它是一个多媒体内容的描述标准。
来自 mpeg.org: > ISO/IEC 15938 > Multimedia content description interface > > A suite of standards for description and search of audio, visual and multimedia content
5.2.MPEG-21
来自 wikipedia: > MPEG-21标准的正式名称为“多媒体框架”,它致力于为多媒体传输和使用定义一个标准化的、可互操作的和高度自动化的开放框架,这个框架考虑到了对象化的多媒体接入以及使用不同的网络和终端进行传输等问题。 MPEG-21标准将各种不同协议、标准和技术融合在一起,透过这种统一环境对全球媒体资源进行统一和管理,进而完整著作权保护、用户隐私权保护、终端和网络资源撷取及事件报告等功能。
来自 mpeg.org: > ISO/IEC 21000 > Multimedia framework > > A suite of standard that define a normative open framework for end-to-end multimedia creation, delivery and consumption that provides content creators, producers, distributors and service providers with equal opportunities in the MPEG-21 enabled open market, and also be to the benefit of the content consumers providing them access to a large variety of content in an interoperable manner.
6.参考资料
- https://zh.wikipedia.org/wiki/MPEG-1
- https://zh.wikipedia.org/wiki/MPEG-2
- https://zh.wikipedia.org/wiki/MPEG-3
- https://zh.wikipedia.org/wiki/MPEG-4
- https://www.mpeg.org/standards/MPEG-7/
- https://www.mpeg.org/standards/MPEG-21/
- https://zh.wikipedia.org/wiki/%E4%BA%92%E8%81%94%E7%BD%91%E5%AA%92%E4%BD%93%E7%B1%BB%E5%9E%8B
- https://juejin.cn/post/6844904083904528392#heading-1
- https://slideplayer.com/slide/2409533/
- https://zhuanlan.zhihu.com/p/402346767
- https://www.cnblogs.com/yinxiangpei/articles/2821954.html
- https://zhuanlan.zhihu.com/p/355803589