前言
趁着项目空期,让我们来走进音视频开发这块神圣的殿堂,哈哈,先了解一下音视频的相关概念吧
视频实质
纯粹的视频(不包括音频)实质上就是一组帧图片,经过视频编码成为视频(video)文件再把音频(audio)文件有些还有字幕文件组装在一起成为我们看到的视频(movie)文件。1秒内出现的图片数就是帧率,图片间隔越小画面就越流畅,所以帧率越高效果就越好,需要的存储空间也就越多
音视频采集
音视频播放得需要数据源,所以从视频采集开始,视频采集有四种实现方式
- UIImagePickerController
- AVCaptureSession+AVCaptureMovieFileOutput
- AVCaptureSession+AVAssetWriter
- GpuImage
具体的采集实现会在接下来的文章中写到,采集完成数据量非常大,会造成存储和传输上的困难,所以视频文件都需要在录制完成后进行编码。视频编码主要从两个维度压缩数据
视频编码
视频编码 这篇文章讲到视频编码概念和编码方式,当然除了了解编码方式我们还需要了解码率(比特率)、帧率、分辨率
这张图片是通过系统UIImagePickerController录制的十秒视频,可以看数据速率,这就是码率
码率:
视频码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍生出来的cbr(固定码率)与vbr(可变码率),都是在这方面做的文章,不过事情总不是绝对的,举例来看,对于一个音频,其码率越高,被压缩的比例越小,音质损失越小,与音源的音质越接近。
码率就是失真度,码率越高越清晰,反之则画面粗糙而多马赛克
(1)码率计算公式
码率 = 采样率 X 位深度 X 声道
(2)文件大小
文件大小 = 码率 X 时长 注:此计算公式对未压缩的wav格式文件有效,不适用于mp3等被压缩的文件。
(3)几点原则
a. 码率和质量成正比,但是文件体积也和码率成正比。这是要牢记的;
b. 码率超过一定数值,对图像的质量没有多大影响;
c. 如果是1M的宽带,在网上只能看不超过1024kbps的视频,超过1024kbps的视频只能等视频缓冲才能顺利观看。
帧率
帧率就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象。高的帧率可以得到更流畅、更逼真的动画。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅。一般来说30fps是可以接受的,所以要避免动作不流畅的最低fps是30。除了30fps外,有些计算机视频格式,例如 AVI,每秒只能提供15帧。我们之所以能够利用摄像头来看到连续不断的影像,是因为影像传感器不断摄取画面并传输到屏幕上来,当传输速度达到一定的水平时,人眼就无法辨别画面之间的时间间隙,所以大家可以看到连续动态的画面。 每秒的帧数(fps)或者说帧率表示图形处理器场景时每秒钟能够更新几次。高的帧率可以得到更流畅、更逼真的动画。一般来说30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力,因为显示器不能以这么快的速度更新,这样超过刷新率的帧率就浪费掉了。 一般用“FPS(frame per second,每秒钟画面更新的数量)”来表示该项指标。在欣赏电视、电影画面时,只要画面的刷新率达到24帧/秒,就能满足人们的需要。同样的,在玩普通的游戏时,如果刷新率达到24帧/秒即可,但在一些高速游戏中(例如射击游戏),如果画面的刷新率还是只有24帧/秒,那么就会感觉到画面比较迟钝,不够流畅。 虽然理论上画面的刷新率越快越好,但过高的刷新率并没有实际意义——当画面的FPS达到60帧/秒时,已经能满足绝大部分应用需求。一般情况下,如果能够保证游戏画面的平均FPS能够达到30帧/秒,那么画面已经基本流畅;能够达到50帧/秒,就基本可以体会到行云流水的感觉了。一般人很难分辨出60 帧/秒与100帧/秒有什么不同。
影响FPS因素:
既然刷新率越快越好,为什么还要强调没必要追求太高的刷新率呢?其中原因是在显示分辨率不变的情况下,FPS越高,则对显卡的处理能力要求越高。电脑中所显示的画面,都是由显卡来进行输出的,因此屏幕上每个像素的填充都得由显卡来进行计算、输出。当画面的分辨率是1024×768时,画面的刷新率要达到24帧/秒,那么显卡在一秒钟内需要处理的像素量就达到了“1024×768×24=18874368”。如果要求画面的刷新率达到50 帧/秒,则数据量一下子提升到了“1024×768×50=39321600”。
FPS与分辨率、显卡处理能力的关系如下:处理能力=分辨率×刷新率。这也就是为什么在玩游戏时,分辨率设置得越大,画面就越不流畅的原因了。
分辨率
分辨率:影响图像大小,与图像大小成正比:分辨率越高,图像越大;分辨率越低,图像越小。
画质
画质就是画面质量。包括清晰度、锐度、镜头畸变、色散度、解析度、色域范围、色彩纯度(色彩艳度)、色彩平衡等几方面指标。
清晰度
在码率一定的情况下,分辨率与清晰度成反比关系:分辨率越高,图像越不清晰,分辨率越低,图像越清晰;
在分辨率一定的情况下,码率与清晰度成正比关系,码率越高,图像越清晰;码率越低,图像越不清晰。
音频编码
音频常用格式
PCM格式
PCM属于编码格式,PCM是经过话筒后直接得到的未经压缩的数据流
数据的大小 = 采样率 * 采样位数 * 声道 * 秒数 / 8
采样率一般是:22K或者是44K
位数一般是:8位或者16位
声道一般是:双声道或者单声道
PCM是一串由多个样本值组成的数据流,本身没有任何头信息或者帧的概念。只有一段PCM数据是没有办法知道它的采样率的信息的。WAV格式
WAV是封装格式,里面本身可以存放多种编码格式,不过一般都存放PCM数据。
WAV文件是由“WAV文件头”和“WAV文件体”组成。前44字节存放采样率,通道数,数据部分的标识符等头信息,后面就是存放数据部分。很显然WAV的头信息一旦损坏了,播放就会产生问题。MP3格式
MP3是封装格式,里面存放的数据使用的编码方式为:MPEG1 Layer-3
MP3是由TAG_V2结构体,TAG_V1结构体,和一组Frame组成。头部和尾部的TAG结构体不一定存在,需要判断。中间的Frame,每一个Frame都是由帧头和数据实体组成,帧头记录了MP3的位率,采样率,版本等信息。每个帧之间相互独立,也就是说即使前面的帧损坏了,后面的也可以播放。AMR格式
AMR是封装格式。
AMR文件包含一个文件头,后面就是一帧一帧的AMR帧。
文件头里面的值就固定值,用于标记文件为AMR文件。
每个帧分为帧头和数据部分,帧头里面包含编发方式和辅助信息。AMR的采样率跟编码方式的不同而不同。AAC格式
AAC文件可以没有文件头,全部由帧序列组成。
每个帧包含帧头和数据部分。
帧头包含采样率,声道数,帧长度等有点类似MP3格式。CAF格式
CAF是苹果的一种音频封装格式,与WAV差不多,里面可以存放LPCM,MP3等多种编码方式。
API里有很多的编码格式可供选择,其中PCM数据是最原始的完全无损的音频数据,所以体积比较庞大,为了解决这个问题,则诞生了一系列的音频编码格式。比如MP3、AAC、等。而现在主流的音频编码格式则是AAC(mp3和AAC的选择请看这里)
采样频率
采样频率是指单位时间内对声音模拟信号的采样次数。采样率类似于视频的帧数,比如电影的采样率是24Hz。当我们把采样到的一个个静止画面再以采样率同样的速度回放时,看到的就是连续的画面。同样的道理,把以44.1kHZ采样率记录的CD以同样的速率播放时,就能听到连续的声音。显然,这个采样率越高,听到的声音和看到的图像就越连贯。当然,人的听觉和视觉器官能分辨的采样率是有限的。对同一段声音,用20kHz和44.1kHz来采样,重放时,可能可以听出其中的差别,而基本上高于44.1kHZ采样的声音,比如说96kHz采样,绝大部分人已经觉察不到两种采样出来的声音的分别了。之所以使用44.1kHZ这个数值是因为经过了反复实验,人们发现这个采样精度最合适,低于这个值就会有较明显的损失,而高于这个值人的耳朵已经很难分辨,而且增大了数字音频所占用的空间。我们所使用的CD的采样标准就是44.1k。
采样位数
采样位数可以理解为采集卡处理声音的解析度。这个数值越大,解析度就越高,录制和回放的声音就越真实。我们首先要知道:电脑中的声音文件是用数字0和1来表示的。连续的模拟信号按一定的采样频率经数码脉冲取样后,每一个离散的脉冲信号被以一定的量化精度量化成一串二进制编码流,这串编码流的位数即为采样位数,也称为量化精度。在电脑上录音的本质就是把模拟声音信号转换成数字信号。反之,在播放时则是把数字信号还原成模拟声音信号输出。采集卡的位是指采集卡在采集和播放声音文件时所使用数字声音信号的二进制位数。采集卡的位客观地反映了数字声音信号对输入声音信号描述的准确程度。例如,同一段音频信息,使用8bit描述单个采样信息,那么采样量化的范围就是0255,如果使用16bit表示单个采样值,那么相应的采样量化的范围为064k。与8位采样位数相比,16位采样的动态范围的宽度更小,动态范围更宽广,声音的被记录的更加精细。一般CD使用的采样位数为16位。
16位二进制数的最小值是0000000000000000,最大值是1111111111111111,对应的十进制数就是0和65535,也就是最大和最小值之间的差值是65535,也就是说,它量化的模拟量的动态范围可以差65535,也就是96.32分贝(20 * lg65535)),所以,量化精度只和动态范围有关,和频率响应没关系。动态范围定在96分贝也是有道理的,人耳的无痛苦极限声压是90分贝,96分贝的动态范围在普通应用中足够使用,所以96分贝动态范围内的模拟波,经量化后,不会产生削波失真的。所谓分贝是指两个相同的物理量(例A1和A0)之比取以10为底的对数并乘以10(或20)。N = 10lg(A1/A0) 分贝符号为"dB",它是无量纲的。式中A0是基准量(或参考量),A是被量度量。被量度量和基准量之比取对数,这对数值称为被量度量的"级"。亦即用对数标度时,所得到的是比值,它代表被量度量比基准量高出多少"级"。
位速/比特率/码率
位速/比特率/码率描述的都是一个东西,是指在一个数据流中每秒钟能通过的信息量。我们可能看到过音频文件用 “128–Kbps MP3” 或 “64–Kbps WMA” 进行描述的情形。Kbps 表示 “每秒千位数”,因此数值越大表示数据越多:128–Kbps MP3 音频文件包含的数据量是 64–Kbps WMA 文件的两倍,并占用两倍的空间。(不过在这种情况下,这两种文件听起来没什么两样。原因是什么呢?有些文件格式比其他文件能够更有效地利用数据, 64–Kbps WMA 文件的音质与 128–Kbps MP3 的音质相同。)需要了解的重要一点是,位速越高,信息量越大,对这些信息进行解码的处理量就越大,文件需要占用的空间也就越多。
从码率的计算公式中可以清楚的看出码率和采样位数的关系:
码率=取样频率×量化精度×声道数,一张CD,双声道,采样率44.1kHz,每个采样位数13bit,时长74分钟(4440秒),则CD的容量为13244100*4440约等于640MB。
VBR、ABR、CBR
VBR(Variable Bitrate)动态比特率。也就是没有固定的比特率,压缩软件在压缩时根据音频数据即时确定使用什么比特率。这是新发展的算法,他们将一首歌的复杂部分用高Bitrate编码,简单部分用低Bitrate编码。主意虽然不错,可惜新编码器的VBR算法很差,音质与CBR相去甚远。幸运的是, Lame完美地优化了VBR算法,使之成为MP3的最佳编码模式。这是以质量为前提兼顾文件大小的方式,推荐编码模式。
ABR(Average Bitrate)平均比特率,是VBR的一种插值参数。Lame针对CBR不佳的文件体积比和VBR生成文件大小不定的特点独创了这种编码模式。ABR也被称为“Safe VBR”,它是在指定的平均Bitrate内,以每50帧(30帧约1秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高流量。举例来说,当指定用192kbps ABR对一段wav文件进行编码时,Lame会将该文件的85%用192kbps固定编码,然后对剩余15%进行动态优化:复杂部分用高于192kbps 来编码、简单部分用低于192kbps来编码。与192kbps CBR相比,192kbps ABR在文件大小上相差不多,音质却提高不少。ABR编码在速度上是VBR编码的2到3倍,在128-256kbps范围内质量要好于CBR。可以做为 VBR和CBR的一种折衷选择。CBR(Constant Bitrate),常数比特率,指文件从头到尾都是一种位速率。相对于VBR和ABR来讲,它压缩出来的文件体积很大,但音质却不会有明显的提高。
真机运行的存储视频信息获取:
1.xcode打开真机和模拟器选项
2.选中运行的项目,下载该appdata文件
3.下载完成选中appdata文件右键显示包内容,从你存储的路径就能看到录制的视频
4.用Mac原生的QuickTime Player打开视频,command + i 就会弹出下图的视频信息
附上参考资料:
UIImagePickerController
AVCaptureSession+AVCaptureMovieFileOutput
AVCaptureSession+AVAssetWriter
GpuImage
iOS音频(基础篇)-常用的音频格式
视频编解码:第三章 视频码率、帧率、分辨率、画质区别
感谢以上朋友的分享