本文章是阅读《音视频开发进阶指南基于android与ios平台的实践》一书的学习笔记。
声音是由物体振动而产生的。声音是一种压力波,振动时使空气产生纵波,由此产生了声波。
声波的三要素是频率、振幅和波形,频率代表音阶的高低,振幅代表响度,波形代表音色。
数字音频涉及到三个概念:采样,量化和编码。
数据采样格式,曾计算出每分钟需要的存储空间约为 10.1 MB,如果仅仅是将其存放在存储设备(光盘、硬盘)中,可能是可以接受的,但是若要在网络中实时在线传播的话,那么这个数据量可能就太大了,所以必须对其进行压缩编码。压缩编码的基本指标之一就是压缩比,压缩比通常小于 1(否则就没有必要去做压缩,因为压缩就是要减小数据容量)。
压缩算法包括有损压缩和无损压缩。无损压缩是指解压后的数据可以完全复原。在常用的压缩格式中,用得较多的是有损压缩,有损压缩是指解压后的数据不能完全复原,会丢失一部分信息,压缩比越小,丢失的信息就越多,信号还原后的失真就会越大。
根据不同的应用场景(包括存储设备、传输网络环境、播放设备等),可以选用不同的压缩编码算法,如 PCM、WAV、AAC、MP3、Ogg 等。
压缩编码的原理实际上是压缩掉冗余信号,冗余信号是指不能被人耳感知到的信号,包含人耳听觉范围之外的音频信号以及被掩蔽掉的音频信号等。
4.1 WAV 编码
PCM(脉冲编码调制)是 Pulse Code Modulation 的缩写(音频裸数据格式)。而 WAV 编码的一种实现(有多种实现方式,但是都不会进行压缩操作)就是在 PCM 数据格式的前面加上 44 字节,分别用来描述 PCM 的采样率、声道数、数据格式等信息。
特点:音质非常好,大量软件都支持。
适用场合:多媒体开发的中间文件、保存音乐和音效素材。
4.2 MP3 编码
MP3 具有不错的压缩比,使用 LAME 编码(MP3 编码格式的一种实现)的中高码率的 MP3 文件,听感上非常接近源 WAV 文件,当然在不同的应用场景下,应该调整合适的参数以达到最好的效果。
特点:音质在 128Kbit/s 以上表现还不错,压缩比比较高,大量软件和硬件都支持,兼容性好。
适用场合:高比特率下对兼容性有要求的音乐欣赏。
4.3 AAC 编码
AAC 是新一代的音频有损压缩技术,它通过一些附加的编码技术(比如 PS、SBR 等),衍生出了 LC-AAC、HE-AAC、HE-AAC v2 三种主要的编码格式。
特点:在小于 128Kbit/s 的码率下表现优异,并且多用于视频中的音频编码。
适用场合:128Kbit/s 以下的音频编码,多用于视频中音频轨的编码。
4.4 Ogg 编码
Ogg 是一种非常有潜力的编码,在各种码率下都有比较优秀的表现,尤其是在中低码率场景下。Ogg 除了音质好之外,还是完全免费的,这为 Ogg 获得更多的支持打好了基础。Ogg 有着非常出色的算法,可以用更小的码率达到更好的音质,128Kbit/s 的 Ogg 比 192Kbit/s 甚至更高码率的 MP3 还要出色。但目前因为还没有媒体服务软件的支持,因此基于 Ogg 的数字广播还无法实现。Ogg 目前受支持的情况还不够好,无论是软件上的还是硬件上的支持,都无法和 MP3 相提并论。
特点:可以用比 MP3 更小的码率实现比 MP3 更好的音质,高中低码率下均有良好的表现,兼容性不够好,流媒体特性不支持。
适用场合:语音聊天的音频消息场景。
假设一部手机屏幕的分辨率是 1280×720,说明水平方向有 720 个像素点,垂直方向有 1280 个像素点,所以整个手机屏幕就有1280×720 个像素点(这也是分辨率的含义)。每个像素点都由三个子像素点组成,这些密密麻麻的子像素点在显微镜下可以看得一清二楚。当要显示某篇文字或者某幅图像时,就会把这幅图像的每一个像素点的 RGB 通道分别对应的屏幕位置上的子像素点绘制到屏幕上,从而显示整个图像。
对于视频帧的裸数据表示,其实更多的是 YUV 数据格式的表示,YUV 主要应用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。与 RGB 视频信号传输相比,它最大的优点在于只需要占用极少的频宽(RGB 要求三个独立的视频信号同时传输)。其中 “Y” 表示明亮度(Luminance 或 Luma),也称灰阶值;而 “U” 和 “V” 表示的则是色度(Chrominance 或 Chroma),它们的作用是描述影像的色彩及饱和度,用于指定像素的颜色。
YUV 最常用的采样格式是 4:2:0,4:2:0 并不意味着只有 Y、Cb 而没有 Cr 分量。它指的是对每行扫描线来说,只有一种色度分量是以 2:1 的抽样率来存储的。相邻的扫描行存储着不同的色度分量,也就是说,如果某一行是 4:2:0,那么其下一行就是 4:0:2,再下一行是 4:2:0,以此类推。对于每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是 4:1。对非压缩的 8 比特量化的视频来说,8×4 的一张图片需要占用 48 字节的内存。
相较于 RGB,我们可以计算一帧为 1280×720 的视频帧,用 YUV420P 的格式来表示,其数据量的大小如下:
1280 * 720 * 1 + 1280 * 720 * 0.5 = 1.318 MB
如果 fps(1 秒的视频帧数目)是 24,按照一般电影的长度 90 分钟来计算,那么这部电影用 YUV420P 的数据格式来表示的话,其数据量的大小就是:
1.318 MB * 24 fps * 90 min * 60 s = 166.8 GB
所以仅用这种方式来存储电影肯定是不可行的,更别说在网络上进行流媒体播放了,那么如何对电影进行存储以及流媒体播放呢?答案是需要进行视频编码。
音频压缩主要是去除冗余信息,从而实现数据量的压缩。那么对于视频压缩,又该从哪几方面来对数据进行压缩呢?其实与前面提到的音频编码类似,视频压缩也是通过去除冗余信息来进行压缩的。相较于音频数据,视频数据有极强的相关性,也就是说有大量的冗余信息,包括空间上的冗余信息和时间上的冗余信息。
对于视频,ISO 同样也制定了标准:Motion JPEG 即 MPEG,MPEG 算法是适用于动态视频的压缩算法,它除了对单幅图像进行编码外,还利用图像序列中的相关原则去除冗余,这样可以大大提高视频的压缩比。截至目前,MPEG 的版本一直在不断更新中,主要包括这样几个版本:Mpeg1(用于 VCD)、Mpeg2(用于 DVD)、Mpeg4 AVC(现在流媒体使用最多的就是它了)。
相比较于 ISO 制定的 MPEG 的视频压缩标准,ITU-T 制定的 H.261、H.262、H.263、H.264 一系列视频编码标准是一套单独的体系。其中,H.264 集中了以往标准的所有优点,并吸取了以往标准的经验,采用的是简洁设计,这使得它比 Mpeg4 更容易推广。现在使用最多的就是 H.264 标准,H.264 创造了多参考帧、多块类型、整数变换、帧内预测等新的压缩技术,使用了更精细的分像素运动矢量(1/4、1/8)和[…]。
8.1 IPB 帧
视频压缩中,每帧都代表着一幅静止的图像。而在进行实际压缩时,会采取各种算法以减少数据的容量,其中 IPB 帧就是最常见的一种。
8.2 PTS 与 DTS
DTS 主要用于视频的解码,英文全称是 Decoding Time Stamp,PTS 主要用于在解码阶段进行视频的同步和输出,全称是 Presentation Time Stamp。在没有 B 帧的情况下,DTS 和 PTS 的输出顺序是一样的。因为 B 帧打乱了解码和显示的顺序,所以一旦存在 B 帧,PTS 与 DTS 势必就会不同,本书后边的章节里会详细讲解如何结合硬件编码器来重新设置 PTS 和 DTS 的值,以便将硬件编码器和 FFmpeg 结合起来使用。这里先简单介绍一下 FFmpeg 中使用的 PTS 和 DTS 的概念,FFmpeg 中使用 AVPacket 结构体来描述解码前或编码后的压缩数据,用 AVFrame 结构体来描述解码后或编码前的原始数据。对于视频来说,AVFrame 就是视频的一帧图像,这帧图像什么时候显示给用户,取决于它的 PTS。DTS 是 AVPacket 里的一个成员,表示该压缩包应该在什么时候被解码,如果视频里各帧的编码是按输入顺序。