AVFoundation框架解析(三)—— 几个关键问题之关于框架的深度概括

版本记录

版本号 时间
V1.0 2017.08.29

前言

AVFoundation框架是ios中很重要的框架,所有与视频音频相关的软硬件控制都在这个框架里面,接下来这几篇就主要对这个框架进行介绍和讲解。感兴趣的可以看我上几篇。
1. AVFoundation框架解析(一)—— 基本概览
2. AVFoundation框架解析(二)—— 实现视频预览录制保存到相册

关于AVFoundation

AVFoundation是您可以用来播放和创建基于时间的视听媒体的几个框架之一,它提供了一个Objective-C接口,你可以使用这个接口用于基于时间的视听数据的详细级别。 例如,您可以使用它来检查,创建,编辑或重新编码媒体文件。你还可以在实时捕获和播放期间从设备获取输入流并操纵视频。 下图显示了其在iOS上的体系结构。

框架在ios体系内的位置

下图展示的是AVFoundation在OS X中的结构或位置。

框架在OS X中的位置

你应该通常使用可用的最高级别抽象,使您可以执行所需的任务:

  • 如果您只想播放电影,请使用AVKit框架
  • 在iOS上,当您只需要最少的格式控制时录制视频,请使用UIKit框架(UIImagePickerController)。

但请注意,您在AV Foundation中使用的一些原始数据结构(包括与时间相关的数据结构和不透明对象携带和描述媒体数据)在Core Media框架中声明。


进一步剖析AV Foundation

AV Foundation框架包括两个部分,一部分是与视频有关的API,另外一个部分是只与音频有关的API,旧的与音频相关的类提供了处理音频的很好的方式。

你可以使用AVAudioSession配置你程序中的音频行为。

1. 使用AVFoundation展示和使用媒体

AVFoundation框架中用来展示媒体的主要类是AVAsset,框架的设计在很大程度上取决于这一表示。理解它的结构会帮你理解框架的工作方式,一个AVAsset对象是一个或多个媒体数据(音频和视频轨道)的集合的聚合表示。 它提供关于整个集合的信息,例如其标题,持续时间,自然呈现大小等。AVAsset不受特定数据格式的限制。它是其他类的超类,用于从URL中的媒体创建资产实例并创建新组合。

资产中的每个媒体数据片段都是统一的类型,称为轨道。在典型的简单情况下,一个轨道表示音频分量,另一个表示视频分量; 然而,在复杂的组合中,音频和视频可能存在多个重叠的轨道。资产也可能有元数据。

AVFoundation框架中一个重要的概念就是,初始化一个asset或者轨道对象,并不一定意味着它可以使用。甚至可能需要一些时间来计算项目的持续时间(例如,MP3文件,可能不包含摘要信息)。而不是在计算值时阻止当前线程,您可以通过使用块定义的回调异步获取值并获取答案。

2. 回放

AVFoundation允许您以复杂的方式管理资产的回放。 为了支持这一点,它将资产的呈现状态与资产本身分开。这就允许你,例如,同时以不同的分辨率,播放同一个资源的不同部分。资产的呈现状态由播放器项目对象管理, 资源内的每个轨道的呈现状态由播放器项目轨道对象管理。使用播放器对象项目和播放器项目轨道,你可以,例如,设置播放器呈现项目的可视部分的大小,设置要在播放过程中应用的音频混合参数和视频合成设置,或在播放过程中禁用该资源的组件。

您可以使用播放器对象播放播放器内容项目,并将播放器的输出定向到Core Animation层。您可以使用播放器队列按顺序调度播放器项目集合内容的播放。

3. 资源的读、写和重编码

AVFoundation允许您以多种方式创建资源的新的表示,你可以简单的对资源进行重编码,或者在iOS 4.1 及以后,你可以对资源的内容执行操作,并将结果另存为新资源。

你可以使用导出会话将现有存在的资源重新编码为由少数常用预设之一定义的格式。如果您需要对转换的更多控制,则在iOS 4.1及更高版本中,您可以一起使用资源读取器和资源编写器对象将资源从一个表示转换为另一个表示。

使用这些对象,例如,您可以选择要在输出文件中表示的轨道,指定您自己的输出格式,或在转换过程中修改资源。

要产生波形的视觉展示,您可以使用资源读取器来读取资产的音轨。

4. 缩略图

要创建视频演示文稿的缩略图,您可以使用要从中生成缩略图的资产初始化AVAssetImageGenerator的实例。AVAssetImageGenerator使用默认启用的视频轨道生成图像。

5. 编辑

AVFoundation使用组合从现有的媒体片段(通常是一个或多个视频和音轨)创建新的资源。您还可以设置音轨的相对音量和斜坡,并设置视频轨道的不透明度和不透明度斜坡。一个组合是在记忆体中保存的一组媒体。 使用导出会话导出作品时,它会折叠到一个文件。

您还可以使用资源编写器从媒体介质(如样本缓冲区或静态图像)创建资源。

6. 静态和视频媒体采集

从摄像机和麦克风录制输入由拍摄会话管理。 采集会话协调从输入设备到诸如电影文件之类的输出的数据流。即使会话正在运行,也可以为单个会话配置多个输入和输出。 您发送消息到会话以启动和停止数据流。

此外,您可以使用预览图层的实例向用户显示相机正在录制的内容。

7. AVFoundation并发编程

来自AVFoundation调用块,键值观察器和通知处理程序的回调不能保证在任何特定的线程或队列上进行,相反,AVFoundation会在执行其内部任务的线程或队列上调用这些处理程序。

就通知和线程而言,有两个基本准则:

  • 与UI相关的通知在主线程发生
  • 要求您创建和/或指定队列的类或方法将返回该队列上的通知。

除了这两个基本准则,您不应该假设在任何特定的线程上返回通知。

如果您正在编写多线程应用程序,则可以使用NSThread方法isMainThread[[NSThread currentThread] isEqual:<#A stored thread reference#>]来测试调用线程是否是您希望执行工作的线程。您可以使用以下方法将消息重定向到相应的线程:performSelectorOnMainThread:withObject:waitUntilDone:performSelector:onThread:withObject:waitUntilDone:modes:

您也可以使用dispatch_async在适当的队列上“弹回”到您的块,用于UI任务的主要队列或用于并发操作的队列。


先决条件

AVFoundationCocoa Framework里比较高级的框架了,为了有效的使用,你必须做到如下几点:

  • 对基础Cocoa开发工具和技术的牢固的了解。
  • block的基本理解
  • 对KVC和KVO的基本理解
  • 对于播放,要对Core AnimationAVKit框架有基本的了解。

后记

未完,待续~~~~

推荐阅读更多精彩内容