如今的应用市场,音视频相关的软件可谓 "百花齐放,百家争鸣",作为一名 Android 开发者,对音视频开发还是比较感兴趣的,所以打算出个系列,做个系统的学习记录,这个系列会持续更新,希望对想学音视频开发的大伙有所帮助。
音频
现实生活中,我们听到的声音都是连续的,这种信号称为模拟信号,模拟信号需要进行数字化后才能在计算机中使用。 我们在计算机上进行音频播放都需要依赖于音频文件,那么音频文件如何生成的呢?音频文件的生成过程是将声音信息采样,量化和编码产生的数字信号的过程。
我们人耳所能听到的声音频率范围为 20Hz - 20KHz,因此音频文件格式的最大带宽是 20KHz,根据奈奎斯特采样定理:为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍。所以,音频文件的采样率一般在 40-50KHz 之间。
PCM
PCM 即脉冲编码调制技术。由于我们人耳听到的声音均为模拟信号,那么我们如何将听到的信息存储起来呢?这就涉及到了 PCM 技术。PCM 技术就是把声音从模拟信号转化为数字信号的技术,即对声音进行采样,量化的过程,经过 PCM 处理后的数据,是最原始的音频数据,即未对音频数据进行任何的编码和压缩处理。
PCM 原理:就是把一个时间连续和取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输,就是对模拟信号先抽样,再对样值幅度量化,编码的过程。
采样频率和采样位数
采样频率:单位时间内对模拟信号的采样次数,它用赫兹(Hz)来表示。采样频率越高,声音的还原就越真实越自然,当然数据量就越大。常见的音频采样率有 44.1kHz(CD音质),48kHz(常用于音频和视频制作),96kHz(高保真音频)等。
采样位数:每个采样点的精度或量化级别,常用的位数有16位,24位,32位等。采样位数决定了每个采样点能够表示的动态范围和音频分辨率。较高的采样位数能够提供更大的动态范围和更好的音频质量,但也需要更多的存储空间。
举个例子,常见的 CD 音质采样率为 44.1kHz,采样位数为 16 位,这就意味着每秒钟会对声音信号进行 44,100 次采样,并且每个采样点使用 16 位二进制数表示。
声道数
声道数指的是能支持不同发声的音响个数,单声道的声道数为一个声道,双声道的声道数为两个声道,立体声道的声道数默认为两个声道,立体声道(4声道)的声道数为四个声道。
码率
码率指的是单位时间内的数据量,常见单位是 kbps,例如 MP3 的常用码率有 128 kbps,192 kbps,256 kbps 和 320 kbps,越高代表着声音音质越好。
码率 = 采样率 * 采样位数 * 声道数
视频
视频由一系列图像帧构成。每个图像帧都是一个静止的图像,通过以一定的速率播放连续的图像帧,就可以创建出动态的影像效果,形成视频。
帧和帧率
帧是指视频图像中的一张静止画面,视频就是由很多帧组成的。
帧率是指单位时间内帧的数量,单位是帧/秒(fps),帧率越高,视频就会感觉越流畅。
电影一般使用的是 24fps,这个帧率能够提供较为自然和传统的观影体验,有些动作片可能会选择更高的帧率来增加动态感和流畅度,例如,《霍比特人》三部曲就采用了 48fps 的高帧率拍摄,《阿凡达2》采用了 48fps + 24fps 两种不同的播放帧率。游戏的帧率通常会选择 60fps 甚至更高,比如王者荣耀的超高帧率是 90fps。
除了 fps,日常生活中我们还会听到赫兹(Hz)这个单位。他俩的含义略有不同,赫兹表示每秒钟刷新的次数,在某些情况下,Hz 和 fps 的数值可以是相同的,例如一个显示器的刷新率为 120Hz 时,每秒刷新 120 次,因此帧率也是 120fps,在这种情况下,Hz 和 fps 的数值是相同的。但是,Hz 和 fps 的数值又不总是相同的,例如,一个显示器的刷新率为 60Hz,但是要播放的视频的帧率只有 30fps,在这种情况下,虽然刷新率为 60Hz,但实际上每秒只显示 30 帧,即 30fps。
色彩空间
色彩空间是指用于表示和描述图像颜色的模型,常用的有以下两种:
- RGB:它是最常用的色彩空间,通过红绿蓝三个原色的不同强度组合来表示图像的颜色。在 RGB 模型中,每个像素由三个分量表示,即红绿蓝的亮度值。
- YUV:它是一种将亮度和色度分开表示的色彩空间,其中,Y 表示亮度分量,而 U 和 V 表示色度分量,Y 分量携带图像的明暗信息,而 U 和 V 分量携带着颜色信息。
由于人眼对亮度更敏感而对色度变化不太敏感,YUV 将亮度和色度分离存储,可以对色度分量进行降低精度或采样率以减少数据量,这使得 YUV 在视频压缩中具有较高的效率。
RGB 和 YUV 的转换
ini
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
ini
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U
音视频容器
我们日常看到的视频格式,都是 MP4,AVI,MKV 等,这些就是包含了音视频编码数据的容器,我们知道,MP4 是目前最流行的视频格式,它支持 H264,H265 等视频编码和 AAC,MP3 等音频编码。
编解码
音视频的原始数据是很庞大的,难以存储和传输。要解决音视频数据的存储和传输问题,就需要对这些数据进行压缩,音视频数据压缩技术就是编码,而解码是相对于编码的,其目的是最大限度的还原原始图像或声音信息,编解码的意义就是便于数据传输和存储。
音频编码
音频编码的格式有很多,例如 MP3,AAC,WMA,FLAC 等,其中,AAC 是一种高级音频编码格式,以其高音质,高压缩效率,多通道支持和低延迟等特点,成为了许多应用场景中的首选音频编码格式,从流媒体到移动设备,都广泛应用于音频传输和存储,大多数情况下,在 MP4 视频文件中的音频数据通常采用 AAC 压缩格式。
视频编码
视频编码的格式有很多,例如 H264,H265,MPEG-2,VP9 等,其中最主流的编码标准应该就是 H264 了,它具有高压缩比和良好的图像质量,H264 的算法比较复杂,实际上,对于 Android 开发来说,编解码的操作通常由框架完成,我们无需深究其算法原理。
解码
软解码和硬解码是两种常见的解码方式。
软解码是通过使用 CPU 来解码音视频数据,由于使用统一的算法,有很好的兼容性,但是软解码使用了 CPU 资源,可能会导致较高的能耗并占用较多的 CPU 使用率,如果 CPU 能力不是很强的话,可能会导致解码速度慢或发热现象。
硬解码是利用设备的专用硬件如 GPU,DSP 等来进行音视频数据的解码操作,硬解码可以提供更高效,更快速的解码性能,但是兼容性可能存在问题,因为不同厂商的设备可能采用不同的硬解码标准,毕竟 Android 碎片化还是有点严重的。
在实际开发中,可以根据具体的需求选择软解码或硬解码。通常情况下,如果需要更好的性能和较低的能耗,可以优先考虑使用硬解码。但是,在一些特殊情况下,如需要对特定的媒体格式进行支持或跨平台的考虑,软解码可能是更合适的选择。