提示💡
- NALU→YUV、RGB、PCM
- NALU:NAL(头部) + VCL(内容)
- VCL:SPS(全局参数,解码信息)+PPS(公共参数,图像)+ IBP帧+SEI(补充信息,纠错)+DTS(解码时间戳) + PTS(显示时间戳)
- GOP(两个I帧之前的图片,由一张 I 帧和数张 B / P 帧组成): IDR(第一个I帧) + BP帧
引言
通过前面的学习,你大致已经知道了关于demux的播放器行为,对于demux(解封装)之后基本流的解码相信已经也有了宏观上的认知。
本章节将会带你进入解码的世界。
想知道多媒体文件中有什么?视频是如何一帧一帧串起来的?播放器如何播放一个多媒体文件,在播放之前播放器内核到底做了哪些事情?
带着这些问题,阅读后面章节,将为你一一解开视频解码的神秘面纱。
但在此之前,你需要对目前主流的H.264编码的网络传输数据有一个大致了解,这样有助于对后续章节的理解。
H.264 分层概念
了解编码的基本一些概念之前,需要了解一些知识。
以H.264/AVC这一视频编码标准,系统框架分为两层:视频编码层面(Video Coding Layer,简称VCL)和网络抽象层面(Network Abstraction Layer,简称NAL)。
VCL
- VCL负责表示有效视频数据的内容。
- VCL层是对核心算法引擎、块、宏块及片的语法级别的定义,最终输出压缩编码后的数据 SODB。NAL层将SODB打包成RBSP然后加上NAL头,组成一个NALU(NAL单元)。
NAL
- NAL 负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。
提示💡
附:
SODB(String ofData Bits,即数据比特串):VCL 最原始的编码数据。RBSP(Raw ByteSequence Payload,即原始字节序列载荷):对 SODB 的重新添加封装。
NALU是什么
NAL unit(NALU)是NAL层单元流的基本语法结构,它包含一个字节的头信息(NALU header)和一系列来自VCL的原始数据字节流(RBSP)。每个NALU是一个一定字语法元素的可变长字节字符串,包括1Byte的头信息(标识后面的RBSP数据类型),以及若干个整数字节的原始字节序列负荷(RBSP)。
NALU header:
NALU header 主要标识后面的RBSP是什么类型的数据。
长度为1 Byte,包含:
- forbidden_bit(1bit)
- nal_reference_bit(2bit)
- nal_unit_type(5bit)
RBSP数据
一个NALU可以携带一个SEI或一个序列参数集 或一个 图像参数集 (后面都会具体介绍这些东西是什么)。
H.264采用NALU接入可适用多种网络,提高了容错能力,比如说根据NALU header可发现丢失的是哪一个VCL单元,冗余编码图像使得基本编码图像丢失仍可得到较“粗糙”的图像。
附:H.264 nal_unit_type****表:
0 Unspecified non-VCL
1 Coded slice of a non-IDR picture VCL
2 Coded slice data partition A VCL
3 Coded slice data partition B VCL
4 Coded slice data partition C VCL
5 Coded slice of an IDR picture VCL
6 Supplemental enhancement information (SEI) non-VCL
7 Sequence parameter set non-VCL
8 Picture parameter set non-VCL
9 Access unit delimiter non-VCL
10 End of sequence non-VCL
11 End of stream non-VCL
12 Filler data non-VCL
13 Sequence parameter set extension non-VCL
14 Prefix NAL unit non-VCL
15 Subset sequence parameter set non-VCL
16 Depth parameter set non-VCL
17..18 Reserved non-VCL
19 Coded slice of an auxiliary coded picture without partitioning non-VCL
20 Coded slice extension non-VCL
21 Coded slice extension for depth view components non-VCL
22..23 Reserved non-VCL
24..31 Unspecified non-VCL
NALU类型
解码是什么?主要做了些什么?
通过前面的学习,我们已经了解到,NALU作为基本的NAL层传输单位,在码流中无处不在,并且不同的NALU有着不同的功能,解码就是对基本流中的NALU中的各项类型进行拆分解析,并生成对应可播放产物。
音频视频播放器没有办法直接使用基本码流播放,必须将基本码流解码成细化图像及数据(对应产物)才能输送到对应的播放器播放。
解码产物
附:
目前中比较常见的音频编码方式:AAC、MP3等视频常见编码方式:H.264、H.265等
得到对应数据后,就可以输送给对应的音视频处理器播放处理。
解码方式:硬解和软解
硬解:通过硬件实现的解码称为硬解码。
- 优点:播放流畅、低功耗、效率高
- 缺点:受视频格式限制、效果可能没有软解好
软解:通过软件实现的解码称为软解码。
- 优点:不受视频格式限制、画质略好于硬解
- 缺点:占用过高CPU的资源、功耗略高、对高清视频可能没有硬解流畅
总结
关于解码,相信你现在有了一定的了解,实际上解码就是将demux后得到基本码流进行再次以对应的编码格式进行解码的行为。