下图是AV Foundation在ios和mac os系统中所处的位置。
- Core audio框架包含了所有音频相关的处理逻辑。该框架提供了高级接口(比如Audio Queue Services框架用于播放和录制音频)和底层接口(比如audio units用于控制音频信号)
- Core video框架为数字类型视频提供了流水线的model。
- Core media被AVFoundation用来作为底层媒体流水线的一部分。Core media提供了用于处理声音采样和视频帧的数据类型和接口,比如CMTime数据类型。
- Core animation框架是一个动画框架,被用于ios和macos。它内部封装了openGL和openGL ES。
虽然AV Foundation框架提供了100多个类和非常多的protocol和非常多的函数和常量,但是我们可以按照“功能单元”的维度对该框架进行拆分,以便我们更好地理解和掌握。拆分成的“功能单元”有:audio播放和录音(audio playback and recording)、media检测(media inspection)、video播放(video playback)、media捕捉(media capture)、media编辑(media editing)、media处理(media处理)、数字media(digital media)、数字media采样(digital media sampling)、audio采样(audio sampling)、数字media压缩(digital media compression)、色度二次采样(chroma subsampling)、编码压缩(codec compression)、video编码(video codec)、h264、audio编码(audio codec)、AAC、容器格式(container formats)。
功能单元1:Audio playback and recording
下图的红框所示的是苹果早期提供的关于audio的接口。比如AVAudioPlayer和AVAudioRecorder提供了一些关于声音播放和录制的简便接口。当然,并不只有这两个类提供了操作音频的功能,AVFoundation框架的其它类也能提供类似功能。
功能单元2:Media inspection
AVFoundation提供了media资源的检查接口,即你不仅可以通过接口知道某个media资源是否能播放、是否能被编辑、是否能被导出,还可以获取到某个media资源的视频时长、创建日期等信息。此外,AVFoundation还提供了AVMetadataItem类来给你读取或者写入media资源相关的元数据,比如album或者artist信息。
功能单元3:Video Playback
AVFoundation提供了名为AVPlayer的播放器,以便让你播放本地或者网络视频。
功能单元4:Media Capture
现在的ios设备都有摄像头,你可以通过AVFoundation提供的名为AVCaptureSession的类来操作摄像头,进而录视频或者音频。
功能单元5:Media Editing
AVFoundation还可以对media资源进行编辑,比如你可以使用其提供的接口来把多条音轨和视轨合并在一起
功能单元6:Media Processing
你可以使用AVAssetReader和AVAssetWriter类来获取或者修改视频帧(video frame)和音频采样(audio samples)。
功能单元7:Digital Media
我们在网上看到的视频和音频、在手机相册里面看到的视频和音频其实都是digital media。media是怎么变成数字化(digital)的呢?在现实世界中,我们肉眼所看到的现实中的景色、耳朵听到的来自自然界发出的声音在到达我们的眼睛或者耳朵之前,都是一种模拟信号,当我们的感官收到这些信号时,我们的感官会把这些模拟信号转化成我们大脑可以识别的脉冲信号,然后把脉冲信号传给大脑,这样大脑就能“体验”到现实世界了。现实世界的信号都是连续的、频率持续变化的,而数字化的信号都是离散的且其状态的值只能为1或者0。采样指的是把模拟信号转换成数字信号的过程。视频由一系列的image(被称为frame)组成,每一个frame都是一张图片。为了给人一种良好的观看体验,视频frame会被快速且连续的播放。每一秒钟所展示的视频frame的数量被称为视频帧率(video’s frame rate),也被称为FPS。视频的常见的帧率一般是24FPS、25FPS、30FPS。
怎么知道一个视频帧(video )的大小?现在的视频帧的宽高比一般都是16:9,即每16个水平像素会对应9个垂直像素。现在的每个视频帧的大小一般都是1280720或者19201080像素,即基于16:9的宽高比例。
那么,每个像素要占用多大的存储空间呢?如果我们使用RGB的颜色空间来表示一个像素的话,那么8个bit用于表示red,8个bit用于表示green,8个bit用于表示blue,一个颜色空间就占用24个bit,即一个像素就占用24个bit,即3个byte。
下图所示的是,一个没被压缩过的、视频帧率是30FPS的视频,且每个像素由RGB颜色空间表示,在不同的分辨率(Resolution)情况下每秒或者每小时所占用的存储空间的大小。
功能单元8:Digital Media Compression & Codec Compression
从上图可以看出,没被压缩过的视频的占用空间非常大(比如一个视频时长为一小时的且为1280*720像素的视频占用的存储空间是278GB),不利于网络的传输和磁盘的存储,为了解决这个问题,我们会把视频进行压缩,一般都是通过对视频进行编码的方式进行压缩,这种编码方式被称为codec compression。编码器(encoder)使用各种压缩算法来压缩视频或者音频,而解码器(decoder)则要解码 被压缩的视频或者音频,以便让播放器能够播放视频或者编辑视频。
功能单元9:Chroma subsampling
表示视频画面的像素的编码方式有两种,一种是前面提到的RGB编码方式(一个像素由24个bit表示,其中的8个bit用于表示red,8个bit用于表示green,8个bit用于表示blue),另一种则是YUV编码方式。现在的视频一般都会被以一种名为YUV的编码方式所编码,因为这种编码方式能节省存储空间。YUV的实现方式是,把每一个像素拆分为luma channel Y(亮度)和chroma(color)channels UV。下图所示的是,一张图片分别被以luma和chroma channel的方式拆分之后的效果图。从图中可以看出,luma channel方式拆分后的效果图(如下图中间的那张图片所示)还保留着图片的轮廓和细节,但没有彩色效果,而chroma channel方式拆分的效果图(如下图中的最后一张图片所示)丢失了大部分的细节。因为我们的肉眼对亮度(Y)更加敏感,所以聪明的工程师就把每个像素中的部分UV数据给舍弃掉(舍弃的过程被称为chroma subsampling),进而达到保证图片质量的基础上降低图片的占用空间的目的。
功能单元10:Container formats
我们在电脑或者手机上看到的视频文件的文件后缀名一般是.mp4、.mov等等,虽然我们常常把这些后缀名称为文件的格式,但准确地定义应该是容器的格式(container formats)。container format也被称为metafile format(元文件格式,你可以把它理解为一个文件夹,该文件夹包含了一种或者多种media类型的文件,比如,一个QuickTime文件包含了多种media类型的数据(比如视频、音频、字幕、文件的描述信息)。每种container format都包含了描述其文件的结构的规范说明书(规范说明书里面包含了视频的时长、视频的编码格式、视频的标题、作者信息)。