前言
早在之前就对音视频开发这块儿比较感兴趣,但是一直没有下定决心学习,一个是觉得这块儿很难,二是感觉自己没有时间去学习,但是现在一想,其实也不算事,有难度才有挑战,如果学好了也是很有成就感的事情,而时间这个问题,就像一句话说的那样,时间嘛,挤一挤总会有的.所以近期,我准备一些学习资料,准备开始自学音视频开发之路.创建这个文集,旨在记录自己学习音视频开发的点点滴滴,也是为了给想要学习这方面知识的同道们提供一些参考.好了,话不多说,进入正文吧.
目录:
- 声音的物理性质
- 数字音频
- 音频编码
- 图像的物理性质
- 图像的数值表示
- 视频的编码方式
声音的物理性质
自然界中,蝉鸣声,鸟儿的啼叫声,小溪潺潺的流水声,这些都是声音,那么声音是如何产生的呢,回想一下中午物理课本上对于声音的定义-----声音是由物体振动产生的.我们看下图:
如上图所示,当小球撞击到音叉的时候,音叉会产生振动,对周围的空气产生挤压,从而产生声音.声音是一种压力波,当演奏乐器,敲打桌面时,他们的振动会引起空气有节奏的振动,从而产生声波.
声波的三要素是频率,振幅和波形.频率代表音阶的高低,振幅代表响度,波形代表音色.
频率越高,波长就越短.低频声波的波长较长,可以更容易绕过障碍物,能量衰减小,可以传播更远的距离.
响度其实就是能量大小的反映,比如你打鼓的力度越大,声音就越大,在生活中,人们用分贝描述声音的响度.
音色也容易理解,在相同的音调(频率)和响度(振幅)下,笛子和钢琴的音色挺起来不同就是因为它们的介质产生的波形不同.
然而人类的耳朵的听力有一个频率范围,大概是20Hz ~ 20kHz.
数字音频
声音是机械振动,振动越强,声音越大,话筒把机械振动转换成电信号,模拟音频技术中以模拟电压的幅度表示声音强弱。
模拟声音在时间上是连续的,而数字音频是一个数据序列,在时间上是断续的。为了将模拟信号数字化,首先要对模拟信号进行采样,所谓采样就是在时间轴上对信号进行数字化.根据奈奎斯特定(采样定理),按比声音最高频率高2倍以上的频率对声音进行采样(这个过程称为AD转换),上面说过,对于高质量的音频信号,其频率范围是20Hz ~ 20kHz ,所以采样频率一般是44.1kHz.这样就能保证采样声音达到20kHz也能被数字化.所谓的44.1kHz就是每秒采样44100次
那么具体的每个采样怎么表示呢,这个就涉及到量化,量化是指在幅度轴上对信号进行数字化.
既然每一个量化都是一个采样,那么这么多的采样如何存储呢,这就涉及到编码.所谓的编码就是按照一定的格式记录采样和量化后的数字数据.
通常所说的音频的裸数据就是脉冲编码调制(Pulse code Modulation , PCM)数据.
音频编码
通常量化后的原始数字音频数据所占存储空间是很大的,如果在网络中进行实时在线传播的话,那这个数据量就非常大了,所以必须对其进行压缩编码.压缩编码的基本指标之一就是压缩比.压缩比通常小于1.压缩算法分为有损压缩和无所压缩,无所压缩是指解压后的数据可以完全复原,而有损压缩解压后的数据不能完全复原,会丢失一些信息,压缩比越小,丢失的信息就越多.
下面介绍几种常用的压缩编码格式:
- WAV编码:WAV编码吗的一种实现(有多种实现,但是都不会进行压缩操作),就是在PCM数据格式的前面加上44字节,用来描述PCM的采样率,声道数,数据格式等信息. 它的特点是 音质非常好,兼容性好,可用于多媒体开发的中间文件,保存音乐和音效素材.
- MP3编码
mp3具有很好的压缩比,使用LAME编码(MP3编码格式的一种实现)的中高码率的MP3文件,听感上非常接近源WAV文件.在不同的应用场景下,可以通过调整合适的参数以达到最好的效果.它的特点是 音质在 128Kbit/s以上表现都还不错,压缩比比较高,兼容性非常好. - AAC编码
AAC是新一代的音频有损压缩技术.它通过一些附加的编码技术衍生出了 LC-AAC , HE-AAC , HE-AAC v2三种主要的编码格式,LC-AAC 主要应用于中高码率的编码(>= 80Kbit/s), HE-AAC主要应用于中低码率的编码(<=80Kbit/s),新近推出的 HE-AAC v2主要应用于低码率场景的编码(<=48Kbit/s), AAC编码在小于128Kbit/s的码率下表现优异,多用于视频中音频轨的编码.
4.Ogg编码
Ogg是一种非常有潜力的编码,在各种码率下都有比较优秀的表现,尤其是在中低码率应用场景下.它可以用比MP3更小的码率实现比MP3更好的音质,高中低码率下均有良好的表现,但是它兼容性不够好,流媒体特性不支持.
图像的物理性质
视频是由一幅幅图像组成的.在日常生活中,由于光的反射,我们能够看到各种物体.但是手机屏幕上能够显示内容,并不是由于光的反射.假设一个手机屏幕的分辨率是750 * 420,那么说明水平方向上有420个像素点,垂直方向有750个像素点,整个手机屏幕就有750 * 420个像素点,每个像素点由三个子像素点组成.当屏幕要显示某幅图像时,会把这个图像的每一个像素点的RGB通道分别对应的屏幕位置的子像素点绘制到屏幕上,从而显示整个图像.
图像的数值表示
1.RGB表示方式
我们已经知道任何一个图像都可以由RGB组成, 那么像素里的子像素如何表示.通常有下面两种表示方式:
1.浮点表示: 取值范围为 0.0 ~ 1.0,
2.整数表示:取值范围为: 0 ~ 255 或者0 ~ FF.
2.YUV表示方式
对于视频帧的裸数据表示,其实更多的是YUV数据格式的表示.YUV主要应用于优化彩色视频信号的传输.与RGB视频信号传输相比,它最大的有点在于只需要占用极少的频宽(RGB要求三个独立的视频信号同时传输),其中"Y"表示明亮度(Luma),也称灰阶值;而"U"和"V"表示的则是色度,它们的作用是描述影像的色彩及饱和度.
视频的编码方式
音频压缩主要是去除冗余信息,从而实现数据量的压缩.那么对于视频压缩,又该从哪几方面来对数据进行压缩呢.相较于音频数据,视频数据具有极强的相关性,也就是说有大量的冗余信息,包括空间上的冗余信息和时间上的冗余信息.使用帧间编码的技术可以去除时间上的冗余信息,包括以下几个部分:
- 运动补偿: 通过先前的局部图像来预测,补偿当前的局部图像,它是减少帧序列冗余信息的有效方法.
- 运动表示: 不同区域的图像需要使用不同的运动矢量来描述运动信息.
- 运动估计: 是从视频序列中抽取运动信息的一整套技术.
上面大概就是有关音视频的相关概念,参考了展晓凯 著的《音视频开发进阶指南》一书,非常感谢这位作者,为我们提供了一本很好的书籍.