《音视频开发进阶指南》读书笔记

delims 于 2022-04-17 发布

音频编码

音频的裸数据格式就是脉冲编码调制(Pulse Code Modulation,PCM)数据。描述一段PCM数据一般需要以下几个概念:量化格式(sampleFormat)、采样率(sampleRate)、声道数(channel)。以CD的音质为例:量化格式(有的地方描述为位深度)为16比特(2字节),采样率为44100,声道数为2,这些信息就描述了CD的音质

CD音质的数据,比特率为多少呢?计算如下:

44100 * 16 * 2 = 1378.125kbps

一分钟CD音质的数据占多大空间

1378.125 * 60 / 8 / 1024 = 10.09MB

pcm格式

pcm是经过话筒录音后直接得到的未经压缩的数据流

数据大小=采样频率*采样位数*声道*秒数/8

采样频率一般是22k或者44k,位数一般是8位或者16位,声道一般是单声道或者双声道 pcm属于编码格式,就是一串由多个样本值组成的数据流, 本身没有任何头信息或者帧的概念,。如果不是音频的录制者,光凭一段PCM数据,是没有办法知道它的采样率等信息的。

采样频率可以认为是声卡的分辨率,数值越大,分辨率越高。

PCM中的声音数据没有被压缩,如果是单声道的文件,采样数据按时间的先后顺序依次存入。(它的基本组织单位是BYTE(8bit)或WORD(16bit))

YUV表示方式

YUV 用于向后兼容黑白电视机。Y 表示命令度,U 和 V 表示色度,用于描述影像的色彩和饱和度。

如果只有Y分量,没有 U 和 V 就是黑白图像。

YUV格式有两大类:平面(planar)和紧凑(packed)。 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。 对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的。以下缩写p表示“紧凑”,sp表示“半紧凑”。

以分辨率8*4为例,数据存储方式如下。

1、yuyv(yuv422)【YUY2】:
YUYVYUYV
YUYVYUYV
YUYVYUYV
YUYVYUYV
YUYVYUYV
YUYVYUYV
YUYVYUYV
YUYVYUYV

2、yvyu(yuv422):
YVYUYVYU
YVYUYVYU
YVYUYVYU
YVYUYVYU
YVYUYVYU
YVYUYVYU
YVYUYVYU
YVYUYVYU

uyvy、vyuy略

3、yuv422p(yuv422):
YYYYYYYY
YYYYYYYY
YYYYYYYY
YYYYYYYY
UUUUUUUU
UUUUUUUU
VVVVVVVV
VVVVVVVV

4、yuv422sp(yuv422):
YYYYYYYY
YYYYYYYY
YYYYYYYY
YYYYYYYY
UVUVUVUV
UVUVUVUV
UVUVUVUV
UVUVUVUV

5、yuv420p(yuv420)【I420】:
YYYYYYYY
YYYYYYYY
YYYYYYYY
YYYYYYYY
UUUUUUUU
VVVVVVVV

6、YV12(yuv420):
YYYYYYYY
YYYYYYYY
YYYYYYYY
YYYYYYYY
VVVVVVVV
UUUUUUUU

7、yuv420sp(yuv420):
YYYYYYYY
YYYYYYYY
YYYYYYYY
YYYYYYYY
UVUVUVUV
UVUVUVUV

##视频的编码方式

H.264创造了多参考帧、多块类型、整数变换、帧内预测等新的压缩技术,使用了更精细的分像素运动矢量(1/4、1/8)和新一代的环路滤波器,这使得压缩性能得到大大提高,系统也变得更加完善。

PTS与DTS

DTS = 解码顺序

PTS = 显示顺序

DTS主要用于视频的解码,英文全称是Decoding Time Stamp,PTS主要用于在解码阶段进行视频的同步和输出,全称是Presentation Time Stamp。在没有B帧的情况下,DTS和PTS的输出顺序是一样的。因为B帧打乱了解码和显示的顺序,所以一旦存在B帧,PTS与DTS势必就会不同,

###GOP的概念

两个I帧之间形成的一组图片,就是GOP(Group Of Picture)的概念。通常在为编码器设置参数的时候,必须要设置gop_size的值,其代表的是两个I帧之间的帧数目

一个GOP中容量最大的就是 I 帧,gop_size 设置的越大,整个画面的质量越好,但是解码端必须从接收到第一个 I 帧才可以解码出原始图像,否则无法正常解码。

提高视频质量的技巧就是多使用 B 帧,B 帧能节省大量空间,节省出来的空间可以存放 I 帧。这样能在相同码率下提供更好画质。

LAME简介

LAME是目前非常优秀的一种MP3编码引擎,在业界,转码成MP3格式的音频文件时,最常用的编码器就是LAME库。当达到320Kbit/s以上时,LAME编码出来的音频质量几乎可以和CD的音质相媲美,并且还能保证整个音频文件的体积非常小,因此若要在移动端平台上编码MP3文件,使用LAME便成为唯一的选择。

https://sourceforge.net/projects/lame/files/lame/3.99/

FDK_AAC简介

FDK_AAC是用来编码和解码AAC格式音频文件的开源库,

https://sourceforge.net/p/opencore-amr/fdk-aac/ci/v0.1.4/tree/

X264简介

X264是一个开源的H.264/MPEG-4 AVC视频编码函数库,是最好的有损视频编码器之一。一般的输入是视频帧的YUV表示,输出是编码之后的H264的数据包,并且支持CBR、VBR模式,可以在编码的过程中直接改变码率的设置,这在直播的场景中是非常实用的(直播场景下利用该特点可以做码率自适应)。

git clone git://git.videolan.org/x264.git

##RIFF格式简介 Resource Interchange File Format(简称RIFF),资源交换文件格式,是一种按照标记区块存储数据(tagged chunks)的通用文件存储格式,多用于存储音频、视频等多媒体数据。Microsoft在windows下的AVI、ANI 、WAV等都是基于RIFF实现的。