概述
AVFoundation是可以用来播放和创建基于时间的视听媒体的几个框架之一,它提供了基于时间的视听数据的详细级别上的 OC 接口,充分利用了多核硬件的优势并大量使用 block 和 Grand Central Dispatch(GCD)机制将复杂的计算进程放在后台线程运行,自动提供硬件加速操作,确保在大部分设备上应用程序能以最佳性能运行。
功能
- 可以用它来检查、创建、编辑、重新编码媒体文件
- 也可以从设备得到输入流和实时捕捉回放过程中操控视频。
架构如下图所示
iOS 上 AVFoundation OSX 上 AVFoundation一般情况下,应该使用能让执行你所需任务的最上层的框架。
比如:
- 如果你只想播放电影,可以使用 AVKit
- iOS 上,如果你只需要对格式进行最低限度的控制时,可以使用 UIKit 框架的
UIImagePickerController
来录制视频。
但是,AVFoundation 中使用的一些基本数据结构(包括与时间相关的数据结构和用于携带和描述媒体数据的不透明对象)是在核心媒体框架中声明的。
简单看一看
AVFoundation 框架的 Api 有两个方面:
- 和视频相关的 Api
- 和音频相关的 Api, 旧的音频类提供了处理音频的简单方法:
1.想要播放音频文件,使用AVAudioPlayer
,还可以使用AVAudioSession
配置应用程序的音频行为。
2.想要录制音频文件,使用AVAudioRecorder
用AVFoundation表示和使用媒体
AVFoundation 框架用于表示媒体的主要类是 AVAsset。理解它的结构对于理解这个框架是很有帮助的。
AVAsset 实例是一个或多个媒体数据(音频和视频轨道)集合的聚合表示,它提供了关于整个集合的信息,比如标题、持续时间、自然表示大小等等。AVAsset 并不绑定到特定的数据格式,它是其他类的超类,用于在 URL 上从媒体创建 asset 的实例和创建新的compositions。
在 asset 实例中,每一个单独的媒体数据都是统一类型的,称为 track (轨道)
在一个典型的简单示例中,一个track 表示音频组件,另一个表示视频组件。然而,在一个复杂的组合中,音频和视频可能会有多个重叠的track, Asset也可能有元数据。
AVFoundation 中的一个重要概念是初始化资产或轨道并不一定意味着它已经准备好使用,它甚至可能需要一些时间来计算一个项的持续时间(例如,MP3 文件可能不包含摘要信息)。计算时不会阻塞当前线程,可以请求值,然后在提供的方法block中 异步获取。
播放
AVFoundation 可以以复杂的方式管理 asset 的播放。为了支持这一点,它将 asset 的表示状态和其本身分离。
例如,这允许您同时以不同的分辨率呈现同一个 asset 的两个不同部分。asset 的表示状态由播放器对象管理。asset 中每个曲目的表示状态由播放器项 track 对象管理。例如,使用播放器项和播放器项track,可以设置播放器显示项的可视部分的大小,设置在播放期间应用的音频混合参数和视频组合设置,或者在播放期间禁用 asset 的组件。
使用一个播放器对象(player object) 来播放播放器项目,并将播放器的输出导向核心动画层,可以使用播放器队列按顺序安排播放器项集合的播放。
读取、写入和重新编码Assets
AVFoundation允许你使用多种方法创建asset 的新表示。你可以简单的对现有的 asset重新编码,或者在 iOS4.1 之后,你可以对一个 asset 的内容执行操作,并且可以把结果保存为一个新的 asset 。
可以使用 export session (导出会话)将现有 asset 重新编码为常用设置之一定义的格式。如果你需要对于转换有更多的控制,在 iOS4.1之后你可以使用 asset reader 和 asset writer 对象将 asset 的表现形式,转换为另一种表现形式。例如,使用这些对象,您可以选择希望在输出文件中表示的 tracks, 指定自己的输出格式,或者在转换的过程中修改 asset.
要生成波形的可视化表示,可以使用asset读取器读取asset的track(音轨)。
缩略图
创建一个视频的缩略图,你需要使用生成缩略图的 asset 创建一个AVAssetImageGenerator
实例,AVAssetImageGenerator
使用默认启用的视频 track(追踪) 去生成图片。
编辑
AVFoundation 使用compositions
(组合)从现有的媒体片段中(通常是一个或多个视频和音频轨道) 创建一个新的 Asset。你可以使用 mutable composition(可变组合)来添加和删除 tracks, 并调整他们的时间顺序。你也可以设置音轨 的相对音量和ramping(倾斜),设置视频轨迹的不透明度。一个 composition 是存储在内存中的媒体片段的集合,当您使用export session
(导出会话)导出一个 composition 时,它会压缩成一个文件。
您还可以使用asset writer
(写入器)从媒体(例如示例缓冲区或静态图像)创建一个 asset。
静态和视频媒体捕获
从摄像头和麦克风录制输入是通过一个capture session
(捕捉会话)来管理的。一个捕捉会话协调从输入设备到输出设备的数据流(比如一个视频文件)。
你可以为一个捕捉会话配置多个输入和输出,甚至是捕捉会话运行的时候。你可以向捕捉会话发送消息去开始或者暂停数据流。
此外,你可以使用一个preview layer
的实例去展示摄像头捕获的内容。
使用AVFoundation进行并发编程
AVFoundation 的回调,包括 block、kvo、和通知的处理,不能保证在任何特定的线程或队列上执行。相反,AVFoundation 在执行内部任务的线程或队列上调用这些处理程序。
avfoundation的回调—对块、键值观察者和通知处理程序的调用—不能保证在任何特定的线程或队列上执行。相反,AVFoundation在执行内部任务的线程或队列上调用这些处理程序。
关于通知和线程,有两个通用的准则:
- 与 UI 相关的通知会发生在主线程上
- 需要你自己创建和/或指定一个队列的类或者方法将在该队列上返回通知。
除了这两个准则之外(也有例外,在参考文档中有提到),您不应该假定在任何特定的线程上都会返回通知。
如果你是一个多线程的应用,可以使用NSThread
的方法isMainThread
或者[NSThread currentThread] isEqual:another thread
去判断任务是否是在你想要的线程上执行。你可以使用performSelector:onThread:withObject
等方法,也可以使用 gcd 的方法。
有几个AVFoundation的例子,包括两个关键的理解和实现摄像头捕获功能:
-
AVCam-iOS: Using AVFoundation to Capture Images and Movies
是实现任何使用相机功能的程序的标准示例代码。它是一个完整的示例,有良好的文档记录,涵盖了显示最佳实践的大部分功能。 -
AVCamManual: Extending AVCam to Use Manual Capture API
是AVCam的配套应用程序。它使用手动相机控件实现相机功能。它也是一个完整的示例,有很好的文档记录,应该被视为创建利用手动控制的相机应用程序的规范示例。 -
RosyWriter
是一个演示实时帧处理,特别是如何对视频内容应用过滤器的例子。这是一个非常常见的开发人员需求,本例将介绍该功能。 -
AVLocationPlayer: Using AVFoundation Metadata Reading APIs
演示如何使用元数据 api。
网友评论