共计 5220 个字符,预计需要花费 14 分钟才能阅读完成。
PS
咱们上一个系列 –OpenGL ES
暂告一段落,如果你对相机滤镜
感兴趣,能够参看之前的文章。
从本篇开始呢,开始记录 Android 音视频的相干常识。
学习路线概览
Android 音视频的基础知识
音频和视频的产生
音频
从物理学的角度上来说,声音 (音频) 是由物体的振动产生的,声音 (音频) 由 振幅(响度)、频率(音调)、音色(谐波) 3 因素组成。
在计算机的畛域中,咱们用 数字模拟电路 来去模仿声音,声音的承载模式是 PCM(脉冲编码调制),然而数字信号并不能间断保留所有工夫点的振幅(咱们事实上也不必这么做)。
依据奈奎斯特采样定理:为了不失真地复原模拟信号,采样频率 应该不小于模拟信号频谱中 最高频率的 2 倍。
这里咱们提到了 采样频率,
采样频率
采样率要大于原声波频率的 2 倍,人耳能听到的最高频率为 20kHz,所以为了满足人耳的听觉要求,采样率至多为 40kHz,通常为 44.1kHz,更高的通常为 48kHz。
除了采样频率外,在计算机领域咱们还有其余方面的术语来形容音频
采样位数
采样位数,波及到下面提到的振幅量化。波形振幅在模拟信号上也是间断的样本值,而在数字信号中,信号个别是不间断的,所以模拟信号量化当前,只能取一个近似的整数值,为了记录这些振幅值,采样器会采纳一个固定的位数来记录这些振幅值,通常有 8 位、16 位、32 位。
位数 | 最小值 | 最大值 |
---|---|---|
8 | 0 | 255 |
16 | -32768 | 32767 |
32 | -2147483648 | 2147483647 |
位数越多,记录的值越精确,还原度越高。
声道数
声道数,是指反对能不同发声(留神是不同声音)的音响的个数。
PS
声道有以下几种
单声道:1 个声道
双声道:2 个声道
立体声道:默认为 2 个声道
立体声道(4 声道):4 个声道
码率
码率,是指一个数据流中每秒钟能通过的信息量,单位 bps(bit per second)
码率 = 采样率 采样位数 声道数
视频
咱们这里的视频与咱们平时的最常看到的视频的概念略微有些不一样,最后的视频的概念来自于 动画
,由一张张的图片组成,以超过人眼辨识的速度播放就成了视频
视频帧率
帧,是视频的一个基本概念,示意一张画面,如下面的翻页动画书中的一页,就是一帧。一个视频就是由许许多多帧组成的。
帧率,即单位工夫内帧的数量,单位为:帧 / 秒 或 fps(frames per second)。如动画书中,一秒内蕴含多少张图片,图片越多,画面越顺滑,过渡越天然。
帧率的个别以下几个典型值:
24/25 fps:1 秒 24/25 帧,个别的电影帧率。
30/60 fps:1 秒 30/60 帧,游戏的帧率,30 帧能够承受,60 帧会感觉更加晦涩真切。
85 fps 以上人眼根本无奈觉察进去了,所以更高的帧率在视频里没有太大意义。
分辨率
分辨率就是帧大小每一帧就是一副图像。640*480 分辨率的视频,倡议视频的码速率设置在 700 以上,音频采样率 44100 就行了一个音频编码率为 128Kbps,视频编码率为 800Kbps 的文件,其总编码率为 928Kbps,意思是通过编码后的数据每秒钟须要用 928K 比特来示意。计算输入文件大小公式:(音频编码率(KBit 为单位)/8 + 视频编码率(KBit 为单位)/8)×影片总长度(秒为单位)= 文件大小(MB 为单位)
色调空间
这里咱们只讲罕用到的两种色调空间。
RGB
RGB 的色彩模式应该是咱们最相熟的一种,在当初的电子设备中利用宽泛。通过 R G B 三种根底色,能够混合出所有的色彩。
YUV
这里着重讲一下 YUV,这种色调空间并不是咱们相熟的。这是一种亮度与色度拆散的色调格局。
晚期的电视都是黑白的,即只有亮度值,即 Y。有了彩色电视当前,退出了 UV 两种色度,造成当初的 YUV,也叫 YCbCr。
Y:亮度,就是灰度值。除了示意亮度信号外,还含有较多的绿色通道量。
U:蓝色通道与亮度的差值。
V:红色通道与亮度的差值。
采纳 YUV 有什么劣势呢?
人眼对亮度敏感,对色度不敏感,因而缩小局部 UV 的数据量,人眼却无奈感知进去,这样能够通过压缩 UV 的分辨率,在不影响观感的前提下,减小视频的体积。
RGB 和 YUV 的换算
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
——————————————————
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U
编解码
首先为什么要对音视频进行 编码(压缩编码), 这个问题也很简略,因为原始的音频或者视频数据太大了,并且蕴含了许多咱们不太须要的信息,所以咱们要对音视频进行编码,有了编码,那么相应的咱们也须要解码来还原咱们的数据
音视频编解码技术从大类别上分为 有损编码 和 无损编码
PS
无损 和 有损的在于 是否对编码后的数据进行 100% 的还原
音频编码
音频编码的技术在这么多年的倒退中,有了很多的压缩技术
如:WAV、MP3、WMA、APE、FLAC 等等,这里有咱们常见的 mp3,wav,还有无损压缩的 APE 以及 FLAC。
然而咱们要次要介绍的是以后支流的音频压缩技术 AAC
AAC 是新一代的音频有损压缩技术,一种高压缩比的音频压缩算法。在 MP4 视频中的音频数据,大多数时候都是采纳 AAC 压缩格局。
AAC 格局次要分为两种:ADIF、ADTS。
- ADIF:Audio Data Interchange Format。音频数据交换格局。这种格局的特色是能够确定的找到这个音频数据的开始,不需进行在音频数据流两头开始的解码,即它的解码必须在明确定义的开始处进行。这种格局罕用在磁盘文件中。
- ADTS:Audio Data Transport Stream。音频数据传输流。这种格局的特色是它是一个有同步字的比特流,解码能够在这个流中任何地位开始。它的特色相似于 mp3 数据流格局。
ADTS 能够在任意帧解码,它每一帧都有头信息。ADIF 只有一个对立的头,所以必须失去所有的数据后解码。且这两种的 header 的格局也是不同的,目前个别编码后的都是 ADTS 格局的音频流。
ADIF 数据格式:
header | raw_data |
---|
ADTS 一帧 数据格式(两头局部,左右省略号为前后数据帧):
视频编码标准
在视频编码倒退的过程中,呈现了许许多多的技术,然而有两个组织有着无足轻重的作用,他们的影响始终继续到当初甚至未来
PS
这两个组织别离是 ITU(International Telecommunication Union)和 MPEG(Moving Picture Experts Group, ISO 旗下的组织)
当初支流的编码格局 H264 就是这两个组织联结定制的编码标准,当然还有下一代更先进的压缩编码标准 H265。
H264 编码简介
H264 是目前最支流的视频编码标准,所以咱们后续的文章中次要以该编码格局为基准。
视频帧
咱们曾经晓得,视频是由一帧一帧画面形成的,然而在视频的数据中,并不是真正依照一帧一帧原始数据保留下来的(如果这样,压缩编码就没有意义了)。
H264 会依据一段时间内,画面的变动状况,选取一帧画面作为残缺编码,下一帧只记录与上一帧残缺数据的差异,是一个动静压缩的过程。
在 H264 中,三种类型的帧数据别离为
I 帧:帧内编码帧。就是一个残缺帧。
P 帧:前向预测编码帧。是一个非残缺帧,通过参考后面的 I 帧或 P 帧生成。
B 帧:双向预测内插编码帧。参考前后图像帧编码生成。B 帧依赖其前最近的一个 I 帧或 P 帧及其后最近的一个 P 帧。
图像组:GOP 和关键帧:IDR
全称:Group of picture。指一组变动不大的视频帧。
GOP 的第一帧成为关键帧:IDR
IDR 都是 I 帧,能够避免一帧解码出错,导致前面所有帧解码出错的问题。当解码器在解码到 IDR 的时候,会将之前的参考帧清空,从新开始一个新的序列,这样,即使后面一帧解码呈现重大谬误,也不会蔓延到前面的数据中。
注:关键帧都是 I 帧,然而 I 帧不肯定是关键帧
DTS 与 PTS
DTS 全称:Decoding Time Stamp。标示读入内存中数据流在什么时候开始送入解码器中进行解码。也就是解码程序的工夫戳。
PTS 全称:Presentation Time Stamp。用于标示解码后的视频帧什么时候被显示进去。
在没有 B 帧的状况下,DTS 和 PTS 的输入程序是一样的,一旦存在 B 帧,PTS 和 DTS 则会不同。
帧的色调空间
后面咱们介绍了 RGB 和 YUV 两种图像色调空间。H264 采纳的是 YUV。
YUV 存储形式分为两大类:planar 和 packed。
- planar:先存储所有 Y,紧接着存储所有 U,最初是 V;
- packed:每个像素点的 Y、U、V 间断穿插存储。
pakced 存储形式曾经非常少用,大部分视频都是采纳 planar 存储形式。
对于 planar 存储形式,通过省略一些色度信息,即亮度共用一些色度信息,进而节俭存储空间。因而,planar 又辨别了以下几种格局:YUV444、YUV422、YUV420。
YUV 4:4:4 采样,每一个 Y 对应一组 UV 重量。
YUV 4:2:2 采样,每两个 Y 共用一组 UV 重量。
YUV 4:2:0 采样,每四个 Y 共用一组 UV 重量。
其中,最罕用的就是YUV420。
YUV420 格局存储形式又分两种类型
- YUV420P:三立体存储。数据组成为 YYYYYYYYUUVV(如 I420)或 YYYYYYYYVVUU(如 YV12)。
- YUV420SP:两立体存储。分为两种类型 YYYYYYYYUVUV(如 NV12)或 YYYYYYYYVUVU(如 NV21)
音视频编解码技术
后面我么说的 AAC 啦,H264 啦都是一种编解码标准,所谓标准就像是接口,在这些标准落地的时候可能不同的平台就有了不同的实现技术。
x264 是目前最好的 H264 的实现了,x264 官网
另外咱们熟知的 FFMpeg,FFMpeg 的官网介绍是 A complete, cross-platform solution to record, convert and stream audio and video. 详情可参看 FFMPeg 官网
但在下面的路线图中把它归类为 软解,所谓软解码,就是指利用 CPU 的计算能力来解码,通常如果 CPU 的能力不是很强的时候,一则解码速度会比较慢,二则手机可能呈现发热景象。然而,因为应用对立的算法,兼容性会很好。
那么在 Android 零碎中咱们还存在着另一个抉择 MediaCodec,这个是 Android 4.1(api 16) 版本引入的编解码接口,是所有想在 Android 上开发音视频的开发人员绕不开的坑。
音视频解决
咱们在对音视频进行编码后,可能须要对编码后的数据进行进一步解决,比方对 音频进行变声 ,对 视频利用滤镜 , 以及 音视频的编辑
音频解决库 FMOD 和 SoundTouch
SoundTouch 是一个开源的音频解决库,用于扭转音频流或音频文件的节奏、音调和播放速率。
FMOD 声音零碎是为游戏开发筹备的音频引擎,商业用途须要购买许可证。除了 SoundTouch 只能对声音进行变调解决性能外,还包含了后面进步和没提到的高级性能(Reverb、Echo、EQ、Flange、3D…)。
SoundTouch 与 FMOD 比照
SoundTouch
长处:开源!因而具备很高的可塑性,能够自在定制齐全实用于本人利用。能够解决音调、速率和节奏性能。
毛病:性能繁多,满足不了需要。
如果只须要解决音调,变男声女声童声等性能应用 SoundTouch 是最佳抉择。如果还须要对声音做其它解决,工夫短缺状况下也能够思考批改源码,退出相应的算法来达到所需的性能。
FMOD
长处:声音解决功能强大,能够不便的对声音进行解决。
毛病:非开源,商用不收费,定制化差。
视频解决
FFMpeg 的性能十分全面,视频剪辑、特效等等操作都能应用 FFMpeg 来进行实现,兼容性也很好,还是跨平台的,这些都是它当初大火的起因吧。
PS
不过对于 GPU(硬件加速),咱们还有其余的抉择,如 OpenGL(同样跨平台),在 Android 上也有实现,如果你对它感兴趣的话请参看之前的系列 OpenGL ESPS
封装格局
咱们下面聊了这么久,音频格式有 PCM,WAV,MP3,AAC 等,视频有 yuv,h264,那么咱们常见得的 mp4、rmvb、avi、mkv、… 呢,咱们到这里可能才意识到,咱们平时所说的视频其实蕴含画面和声音,而下面所说的视频仅仅是单纯的画面。
咱们通常所说的视频其实是包裹了音视频编码数据的容器,用来把以特定编码标准编码的视频流和音频流混在一起,成为一个文件,例如下面的 mp4、rmvb、avi、mkv、…。
音视频输入
咱们在通过下面一系列的步骤之后终于来到了输入,如果咱们是播放音视频文件,那么输入个别是 SufaceView 或者 TextureView,如果是对音视频的录制,那么有可能是输入本地音视频文件, 如 mp4、rmvb、avi、mkv、… 也有可能是在网络上进行传输,那么 RTMP,WebRTC 之类的传输协定也是咱们须要学习的内容。
小结
咱们本篇次要介绍了音视频的一些基础知识和学习路线,算是为咱们之后的内容做个铺垫吧。