最近要学音视频,在图书馆借到这本《音视频开发进阶指南》,读了一段时间以为挺好就在某宝买了。html
之后一段时间应该都会沉浸在研究音视频中,开个专题记录哈每一章的读书笔记吧(以iOS开发的角度记录,安卓的暂时不涉及)。算法
本章介绍了 声音、图像、视频的相关概念。笔者在书本的基础上,研究了一些本身读书时好奇的问题,而且记录在这篇文章中。网络
声波的三要素:频率、振幅和波形。频率表明音阶的高低,振幅表明响度,波形表明音色。post
频率越高,波长就越短。低频声响的波长则较长,因此其能够更容易地绕过障碍物,所以能量衰减就小,声音就会传得远。人的听力有一个频率范围,大约是20Hz~20kHz。学习
响度是能量大小的反应。ui
波的形状决定了其所表明的音色。编码
将模拟信号数字化,要通过3个步骤,采样,量化和编码。.net
采样:在时间轴上对信号进行数字化。对应着声音的频率。3d
根据奈奎斯特定理,按比声音最高频率高2倍以上的频率对声音进行采样,通过数字化处理以后,人耳听到的声音质量不会被下降。因此采样频率通常为44.1kHz。orm
量化:在幅度轴上对信号进行数字化。对应着声音的振幅。
好比,每一个采样用16比特的二进制信号来表示,则范围是[-32768, 32767]。
采样和量化,能勾画出波的形状,即音色。声波的三要素就转化完成了。
编码,就是按照必定的格式记录采样和量化后的数字数据,好比顺序存储或压缩存储,等等。
描述一段PCM数据通常须要如下几个概念:量化格式(sampleFormat)、采样率(sampleRate)、声道数(channel)。
量化格式和采样率上面提到过了,声道数是指支持能不一样发声的音响的个数。不难理解,立体声道的声道数默认为2个声道。
以CD的音质为例,量化格式(位深度)为16比特,采样率为44100,声道数为2。
比特率 44100 * 16 * 2 = 1378.123kbps
一分钟这类数据的存储空间 1378.125 * 60 / 8 / 1024 = 10.09MB
压缩编码的原理其实是压缩掉冗余信号,冗余信号是指不能被人耳感知到的信号,包含人耳听觉范围以外的音频信号以及被掩蔽掉的音频信号等。人耳听觉范围以外的音频上面提到过。被掩蔽掉的音频信号则主要是由于人耳的掩蔽效应,主要表现为频域掩蔽效应与时域掩蔽效应。
书上没有介绍掩蔽效应,估计对于应用层的开发人员来讲,不用理解也能够。但笔者仍是查阅了一番,感叹一句,人类真奇妙。
这里引用了百度百科的资料,不感兴趣的能够直接略过。
频域掩蔽效应
一个强纯音会掩蔽在其附近同时发声的弱纯音,这种特性称为频域掩蔽,也称同时掩蔽(simultaneous masking)。如,一个声强为60dB、频率为1000Hz的纯音,另外还有一个1100Hz的纯音,前者比后者高18dB,在这种状况下咱们的耳朵就只能听到那个1000Hz的强音。若是有一个1000Hz的纯音和一个声强比它低18dB的2000Hz的纯音,那么咱们的耳朵将会同时听到这两个声音。要想让2000Hz的纯音也听不到,则须要把它降到比1000Hz的纯音低45dB。通常来讲,弱纯音离强纯音越近就越容易被掩蔽;低频纯音能够有效地掩蔽高频纯音,但高频纯音对低频纯音的掩蔽做用则不明显。
因为声音频率与掩蔽曲线不是线性关系,为从感知上来统一度量声音频率,引入了“临界频带(criticalband)”的概念。一般认为,在20Hz到16kHz范围内有24个临界频带。
时域掩蔽效应
除了同时发出的声音之间有掩蔽现象以外,在时间上相邻的声音之间也有掩蔽现象,而且称为时域掩蔽。时域掩蔽又分为超前掩蔽(pre-masking)和滞后掩蔽(post-masking),如图12-05所示。产生时域掩蔽的主要缘由是人的大脑处理信息须要花费必定的时间。通常来讲,超前掩蔽很短,只有大约5~20ms,而滞后掩蔽能够持续50~200ms。这个区别也是很容易理解的。
下面介绍几种经常使用的压缩编码格式。简单看一下就行。
WAV 编码的一种实现就是在PCM 数据格式的前面加上44字节,分别用来描述PCM 的采样率、声道数、数据格式等信息。
特色:音质很是好,大量软件都支持。
适用场合:多媒体开发的中间文件、保存音乐和音效素材。
MP3,使用LAME 编码的中高码率的MP3文件,听感上很是接近源WAV文件。
特色:音质在128Kbit/s以上表现还不错,压缩比比较高,大量软件和硬件都支持,兼容性好。
适用场合:高比特率下对兼容性有要求的音乐欣赏。
特色:在小于128Kbit/s 的码率下表现优异,而且多用于视频中的音频编码。
适用场合:128Kbit/s 如下的音频编码,多用于视频中音频轨的编码。
特色:能够用比MP3更小的码率实现比MP3更好的音质,高中低码率下均有良好的表现,兼容性不够好,流媒体特性不支持。
适用场合:语音聊天的音频消息场景。
关于音频的概念,书上就介绍到以上。但笔者还有困惑,一段音频,播放器是怎么知道它的采样率、声道数、数据格式呢?
因而笔者查阅到这篇文章WAV 文件格式。简单点说,就是头部的某一段,被定义下来表明的含义。因此编解码就按照约定的意义执行。
至于其余编码格式,文件格式是怎么样的,就请读者有须要的时候再查阅了。
假设一部手机屏幕的分辨率是 1280 * 720,说明有1280列,720行,因此整个手机屏幕就有1280 * 720 个像素点。每一个像素点由三个子像素点组成。这三个像素点分别为红、绿、蓝,共同做用下造成一种颜色。
浮点表示:取值范围为 0.0 ~ 1.0,好比,在OpenGL ES中对每个子像素点的表示使用的就是这种表达方式。
整数表示:取值范围为 0 ~ 255 或者 00 ~ FF,8个比特表示一个子像素,32个比特表示一个像素,这就是相似于某些平台上表示图像格式的 RGBA_8888 数据格式。好比, Android 平台上 RGB_565 的表示方法为16比特模式表示一个像素, R 用5个比特来表示, G 用 6个比特来表示, B 用5个比特来表示。
对于一幅图像,通常使用整数表示方法来进行描述,好比计算一张 1280 * 720 的 RGBA_8888图像的大小,这也是位图(bitmap)在内存中所占用的大小。
1280 * 720 * 32 / 8 = 3.516MB
“Y”表示明亮度,也称灰阶值;而“U”和“V”表示的则是色度,它们的做用是描述影像的色彩及饱和度,用于指定像素的颜色。
“U”和“V”分别用Cr 和 Cb来表示。分别反映了 RGB 输入信号红色部分和蓝色部分 与 RGB 信号亮度值之间的差别。
若是只有 Y 信号份量而没有U、V份量,那么这样表示的图像就是黑白灰度图像。
最经常使用的表示形式是Y、U、V都使用一个字节来表示,因此取值范围就是 0 ~ 255。
YUV最经常使用的采样格式是 4:2:0。
这并不意味着只有Y、Cb,没有Cr份量。直接上图,方便理解。
如下说的取样针对UV份量。 4:4:4表示彻底取样,每个Y对应一组UV份量。 4:2:2表示2:1的水平取样,垂直彻底采样,每两个Y共用一组UV份量。 4:2:0表示2:1的水平取样,垂直2:1采样,每四个Y共用一组UV份量。
举书本上一个例子,能够看到,色度的抽样率是4:1,即Y:U:V为4:1:1。32个像素点,就有32个Y,U和V一共16个,按1字节来算,占用48字节存储空间。
这一部分略,就是套用一个合理的转化公式转换。
书上关于图像就介绍到以上。笔者本身还查阅了图像的文件组成。
jpg是有损压缩格式,png是无损压缩格式。
有关它们的区别。
对于jpg文件格式,查到这篇jpg文件格式分析。和WAV 文件格式原理相似。
有趣的是,文件格式里有一段用于表述缩略图的数据。
在iOS开发中,相册显示图片时,能够先读取缩略图。具体显示时再加载原图数据。
采集到的视频源存在冗余信息,咱们能够经过帧间编码技术以及帧内编码技术分别去除时间上和空间上的冗余信息。具体怎么作以及为何能够这么作,具体请看这篇文章,书上没有介绍这部分。
通过一系列的去处冗余信息,能够大大的下降视频的数据量,更利于视频的保存、传输,去除冗余信息的过程,咱们就称之为压缩编码。
压缩编码有不少标准,目前应用最普遍的是ITU-T 制定的H.264(AVC),以高压缩高质量和支持多种网络的流媒体传输著称。
原理:分组,组内每一帧之间能够经过互相参照,从而去掉冗余的信息。
先来了解有关的概念
IPB 帧
通常来讲 I的压缩率是7,P的压缩率是20,B能够达到50。
两个 I 帧之间造成的一组图片,就是GOP(Group Of Picture)的概念。gop_size表示的是两个 I 帧之间的帧数目。
在解码器中,一旦接收到一个 IDR 帧,就会当即清理参考帧缓冲区,并将 IDR 帧做为被参考的帧。
两种不一样的时间戳。DTS(Decoding Time Stame)主要用于视频的解码,PTS(Presentation Time Stamp) 主要用于在解码阶段进行视频的同步和输出。
前面说到B帧,是先后预测帧。因此在解码时,会打乱解码和显示的顺序。因此存在B帧,PTS 和 DTS势必就会不一样。
除了H.264,ISO制定的标准:Motion JPEG即,MPEG,MPEG 算法是适用于动态视频的压缩算法。
H.264 和 MPEG 只是编码算法,文件后缀名取决于你选取的封装容器。
书上第一章的内容介绍到以上就结束了。
跟音频和图像比起来,视频的文件组成复杂不少。
2019.5.17更新
回看这章,以为有必要补充一点知识。
封装:运用编码算法处理后,再封装成某种类型的文件。例如PCM -> WAV,这种没用到编码算法,而后再文件数据头添加一些说明音频的信息,封装成.wav文件。
解封装:封装的时候,会有音视频的信息。解封装时,根据这份说明,把二进制数据识别出来。
编码:就是按照必定的格式记录采样和量化后的数字数据,好比顺序存储或压缩存储,等等。例如视频进行压缩编码,去除空间冗余信息。固然不可能每一帧都存满每个像素点的数据,而是要利用说明信息,告诉是怎么编的。
解码:就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。上面编完码的视频,根听说明信息,生成每一帧的图像。
视音频同步:图像和声音的同步。视频和音频都有时间戳。有三种方法同步,第三章会提到。
协议/解协议:类比于计网协议。在网络上传输时,遵照哪一个协议,接收端就做出相应的处理。协议除了音视频数据,还能有播放等指令。
因此接收到网络上的视频流,会有如下步骤。
[1] 展晓凯,魏晓红.音视频开发进阶指南(基于Android与iOS平台的实践)[M].北京:机械工业出版社,2018:1-13.