AVFoundation 指南

由于本人工作的公司经营不下去了,所以本人现在处于待业状态,正好有时间充充电,翻译一下苹果的官方文档,参考工具是dash

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

我们通常应该使用可用的最高级别的抽象,来执行所需的任务。

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

AVFoundation框架有两个方面 - 与仅与音频相关的视频和API相关的API。 较旧的音频相关类提供了处理音频的简单方法。 它们在Multimedia Programming Guide中有所描述,不在本文档中。

  • 要播放声音文件,您可以使用AVAudioPlayer。
  • 要录制音频,您可以使用AVAudioRecorder。

您还可以使用AVAudioSession配置应用程序的音频行为; 这在Audio Session Programming Guide中描述。

用AVFoundation表示和使用媒体

AV Foundation框架用来表示媒体的主要类是AVAsset。框架的设计主要由这种表示法指导。了解其结构将帮助您了解框架的工作原理。 AVAsset实例是一个或多个媒体数据(音频和视频轨道)的集合的聚合表示。它提供关于作为整体的集合的信息,例如其标题,持续时间,自然呈现大小等。 AVAsset不绑定到特定的数据格式。 AVAsset是用于通过URL(参见Using Assets源)和媒体创建asset实例并创建新合成的其他类的超类(请参阅Editing)。

Asset中的各个媒体数据片段是统一类型并称为轨道。在典型的简单情况下,一个轨道表示音频分量,另一个轨道表示视频分量;然而,在复杂的构成中,可能存在音频和视频的多个重叠轨道。Asset也可以具有元数据。

AV Foundation的一个重要概念是,初始化Asset或轨道并不一定意味着它已准备就绪。可能需要一些时间来计算项目的持续时间(例如,MP3文件可能不包含摘要信息)。在计算值时,不要阻塞当前线程,而是要求值并通过使用block的回调异步获取答案。

  • 相关章节 Using Assets, Time and Media Representations

重放

AVFoundation允许您以复杂的方式管理Asset的播放。 为了支持这一点,它将Asset的呈现状态与Asset本身分离。 这允许您例如在同一时间播放同一Asset的两个不同片段,并以不同分辨率呈现。 Asset的呈现状态由播放器项目对象管理; 资产内的每个轨道的呈现状态项目轨迹由播放器对象管理。 使用播放器项目和播放器项目轨道,例如,可以设置播放器呈现项目的视觉部分的大小,设置将在回放期间应用的音频混合参数和视频组合设置,或禁用 播放期间的资产。

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

  • 参考章节 Playback

读,写,和重新编码Asset

AVFoundation允许您以多种方式创建Asset的新表示。 您可以简单地重新编码现有Asset,或者在iOS 4.1及更高版本中,您可以对Asset的内容执行操作,并将结果保存为新Asset

您使用导出会话将现有Asset重新编码为由少量常用预设之一定义的格式。 如果您需要更多地控制转换,在iOS 4.1和更高版本中,您可以使用Asset读取器和Asset写入器对象来将Asset从一个表示转换为另一个。 使用这些对象,例如,您可以选择要在输出文件中表示的曲目,指定您自己的输出格式,或在转换过程中修改Asset

要生成波形的视觉表示,您可以使用Asset读取器读取Asset的音轨。

  • 参考章节 Using Assets

缩略图

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

  • 参考章节 Using Assets

编辑

AVFoundation使用组合从现有的媒体片段(通常为一个或多个视频和音频轨道)创建新Asset。 您可以使用可变合成添加和删除曲目,并调整其时间顺序。 您还可以设置音轨的相对音量和斜坡; 并设置视频轨道的不透明度和不透明度斜坡。 组合物是保存在存储器中的多个媒体的集合。 当您使用导出会话导出合成时,它会折叠到一个文件。

您还可以使用Asset写入器从介质创建Asset,如样本缓冲区或静态图像

  • 参考章节 Editing

静止和视频媒体的捕获

来自相机和麦克风的记录输入由捕获会话管理。 捕获会话协调从输入设备到诸如电影文件的输出的数据流。 您可以为单个会话配置多个输入和输出,即使会话正在运行。 您向会话发送消息以启动和停止数据流。

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

  • 参考章节 Still and Video Media Capture

使用AVFoundation的并发编程

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

这里是通知和线程的两个一般准则:
  • UI相关的通知发生在主线程上。
  • 需要您创建和/或指定队列的类或方法将在该队列上返回通知。
除了这两个指南(有例外,在参考文档中注明),你不应该假设任何特定的线程将返回通知
如果你正在编写一个多线程应用程序,你可以使用NSThread方法isMainThread或[[NSThread currentThread] isEqual:<#一个存储的线程引用#>]来测试调用线程是否是你期望执行你的工作的线程。 您可以使用诸如performSelectorOnMainThread:withObject:waitUntilDone:和performSelector:onThread:withObject:waitUntilDone:modes:等方法将消息重定向到相应的线程。 您还可以使用dispatch_async在适当的队列上“弹回”您的block,即UI任务的主队列或用于并行操作的队列。 有关并发操作的更多信息,请参阅Concurrency Programming Guide; 有关block的详细信息,请参阅Blocks Programming Topics。 AVCam-iOS:使用AVFoundation捕获图像和电影示例代码被认为是所有AVFoundation功能的主要示例,可以参考AVFoundation的线程和队列使用示例。

先决条件

AVFoundation是一个高级Cocoa框架。 要有效地使用它,您必须具有:

  • 一个坚实的理解基本的Cocoa开发工具和技术
  • 基本掌握block
  • 对键值编码和键值观察的基本理解
  • 对于播放,对Core Animation的基本理解(请参阅Core Animation Programming Guide或基本播放,AVKit Framework Reference。

另请参阅

有几个AVFoundation示例,包括两个是理解和实现的关键相机捕获功能:

AVCam-iOS:使用AVFoundation捕获图像和电影是用于实现使用相机功能的任何程序的规范示例代码。 它是一个完整的示例,有详细的文档,涵盖了显示最佳实践的大多数功能。

AVCamManual:将AVCam扩展为使用手动捕获API是AVCam的配套应用程序。 它使用手动相机控制来实现相机功能。 它也是一个完整的例子,良好的文档,应该被视为创建利用手动控制的相机应用程序的规范示例。

RosyWriter是一个演示实时帧处理的示例,特别是如何对视频内容应用过滤器。 这是一个非常常见的开发人员要求,此示例涵盖了该功能。

AVLocationPlayer:使用AVFoundation元数据阅读API演示使用元数据API。

AVAsset

推荐阅读更多精彩内容