提示💡

  • NALUYUV、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 类型有很多,其中重要的有 SPSPPS

解码是什么?主要做了些什么?

通过前面的学习,我们已经了解到,NALU作为基本的NAL层传输单位,在码流中无处不在,并且不同的NALU有着不同的功能,解码就是对基本流中的NALU中的各项类型进行拆分解析,并生成对应可播放产物

音频视频播放器没有办法直接使用基本码流播放,必须将基本码流解码成细化图像及数据(对应产物)才能输送到对应的播放器播放。

解码产物

  • 音频解码获得的数据是PCM采样数据,称为: sample
  • 视频解码获得的数据是一幅 YUVRGB图像数据,称为: picture

附:

目前中比较常见的音频编码方式:AAC、MP3等视频常见编码方式:H.264、H.265等

得到对应数据后,就可以输送给对应的音视频处理器播放处理。

解码方式:硬解和软解

硬解:通过硬件实现的解码称为硬解码。

  • 优点:播放流畅、低功耗、效率高
  • 缺点:受视频格式限制、效果可能没有软解好

软解:通过软件实现的解码称为软解码。

  • 优点:不受视频格式限制、画质略好于硬解
  • 缺点:占用过高CPU的资源、功耗略高、对高清视频可能没有硬解流畅

总结

关于解码,相信你现在有了一定的了解,实际上解码就是将demux后得到基本码流进行再次以对应的编码格式进行解码的行为。

现在你可以去学习下一个小章节关于NALU中包含的信息:SPS和PPSIBP帧等。