写在前面
如果大家需要学习了解AVFoundation的可以关注我的专题《AVFounation官方稳当翻译》
正文
AVFoundation是几个可以用来播放和创建基于时间的音频媒体的框架之一。它提供了一个objective - c接口,您可以使用它在一个基于时间的audiovisual数据的详细级别上工作。例如,您可以使用它来检查、创建、编辑或重新编码媒体文件。您还可以从设备中获取输入流,并在实时捕获和回放期间操作视频。图i - 1显示了iOS上的架构。
图i - 2显示了OS X上相应的媒体架构。
通常,您应该使用可用的最高级别的抽象,使您能够执行所需的任务。
- 如果你只是想播放电影,那就使用AVKit框架。
- 在iOS上,当你只需要最小的控制格式时,就可以录制视频,使用UIKit框架(UIImagePickerController)。
但是,请注意,您在AVFoundation上使用的一些原始数据结构(包括与时间相关的数据结构和不透明的对象,用于携带和描述媒体数据)是在核心媒体框架中声明的。
At a Glance
有两个方面的AVFoundation框架api与视频和api相关的仅仅是音频。老式的音频相关类提供了处理音频的简单方法。它们在多媒体编程指南中被描述,而不是在这个文档中。
- 要播放声音文件,你可以使用 AVAudioPlayer
- 要录制音频,您可以使用 AVAudioRecorder
您还可以使用 AVAudioSession配置应用程序的音频行为;这是在 Audio Session Programming Guide中描述的。
代表和使用有AVFoundation的媒体
AV Foundation框架用来表示媒体的主要类是 AVAsset。框架的设计在很大程度上是由这种表现所引导的。了解它的结构将有助于您理解框架是如何工作的。AVAsset实例是一个或多个媒体数据(音频和视频跟踪)集合的聚合表示。它提供关于整个集合的信息,例如它的标题、持续时间、自然呈现大小等等。AVAsset与特定的数据格式无关。AVAsset是其他类的超类,用于在URL中从媒体创建资产实例(参见 Using Assets),并创建新的组合(参见 Editing)。
资产中的每个单独的媒体数据片段都是统一类型的,称为跟踪。在一个典型的简单情况下,一个轨道代表音频组件,另一个表示视频组件;然而,在一个复杂的组合中,可能有多个重叠的音频和视频轨道。资产也可以有元数据。
AVFoundation的一个重要概念是,初始化资产或跟踪并不意味着它已经准备好使用。它可能需要一些时间来计算一个条目的持续时间(例如,MP3文件可能不包含摘要信息)。在计算值时,与其阻塞当前的线程,还可以请求值,并通过使用块定义的 block异步获得应答。
相关章节:Using Assets, Time and Media Representations |
---|
Playback(回放)
AVFoundation允许您以复杂的方式管理asset的回放。为了支持这一点,它将asset的表示状态与asset本身分离开来。例如,这允许您在不同的分辨率下同时处理同一asset的两个不同部分。asset的表示状态由播放器项对象管理;资产中的每个轨道的表示状态由一个播放器项目跟踪对象管理。例如,使用播放器项和播放器项轨道,可以设置该播放器的可视部分的大小,设置在playback期间应用的音频混合参数和视频组合设置,或者在回放期间禁用该asset的组件。
您可以使用一个播放器对象播放播放器项,并将播放器的输出直接输出到核心动画层。您可以使用一个播放器队列来按顺序播放一组播放器项的回放。
相关章节:Playback |
---|
Reading, Writing, and Reencoding Assets(阅读、写作和重新编码asset)
AVFoundation允许您以多种方式创建asset的新表示。您可以简单地对现有asset进行重新编码,在ios4.1和later中,您可以对asset的内容执行操作,并将结果保存为新asset。
您使用一个导出会话将现有asset重新编码为一个由少数常用的预置中的一个所定义的格式。如果您需要对转换进行更多的控制,在ios4.1中,稍后您可以使用asset读取器和asset编写器对象,将asset从一个表示转换到另一个表示。例如,使用这些对象,可以选择希望在输出文件中表示的路径,指定您自己的输出格式,或者在转换过程中修改asset。
为了生成波形的可视化表示,您需要使用一个asset读取器来读取asset的音频跟踪。
相关章节:Using Assets |
---|
Thumbnails(缩略图)
为了创建视频演示的缩略图,您需要使用您想要生成缩略图的资产来初始化AVAssetImageGenerator的实例。AVAssetImageGenerator使用默认的启用视频轨迹来生成图像。
相关章节:Using Assets |
---|
Editing(编辑)
AVFoundation使用组合来从现有的媒体(通常是一个或多个视频和音频轨道)创建新资产。您可以使用可变组合来添加和删除跟踪,并调整它们的时间顺序。你还可以设置音频轨道的相对音量和音量;设置不透明和不透明的视频轨道。构图是保存在记忆中的媒体片段。当您使用导出会话导出一个组合时,它会崩溃到一个文件。
您还可以从媒体(如示例缓冲区)或使用资产编写器的静态图像创建资产。
相关章节 Editing |
---|
Still and Video Media Capture(视频媒体捕捉)
从相机和麦克风记录输入是通过捕获会话管理的。捕获会话协调从输入设备到输出(如电影文件)的数据流。您可以为单个会话配置多个输入和输出,即使会话正在运行。您将消息发送到会话以启动和停止数据流。
此外,您还可以使用一个预览层的实例向用户显示一个摄像头正在录制的内容。
相关章节:Still and Video Media Capture |
---|
并发编程与AVFoundation
在任何特定的线程或队列中,都不能保证对blocks, key-value observers和 notification handlers的调用的 回调。相反,AVFoundation在执行内部任务的线程或队列上调用这些处理程序。
关于通知和线程,有两种通用的指导原则:
- 在主线程上出现了与UI相关的通知。
- 需要创建和/或指定队列的类或方法将在该队列上返回通知。
除了这两个指导方针(在参考文档中也有例外情况),您不应该假设在任何特定的线程上返回通知。
如果您正在编写一个多线程应用程序,您可以使用 NSThread 方法isMainThread或[[NSThread currentThread]isEqual:< # a存储线程引用# >]来测试调用线程是否是您希望执行工作的线程。可以把消息重定向到适当的线程使用方法如performSelectorOnMainThread:withObject:waitUntilDone:和
performSelector:onThread:withObject:waitUntilDone:modes:模式:。您还可以使用dispatch_async在适当的队列上“反弹”到您的块上,或者是用于UI任务的主队列,或者是用于并发操作的队列。有关并发操作的更多信息,请 Concurrency Programming Guide;有关block的更多信息,请参见 Blocks Programming Topics。 AVCam-iOS: Using AVFoundation to Capture Images and Movies被认为是所有AVFoundation功能的主要示例,并可以参考AVFoundation的线程和队列使用示例
Prerequisites(先决条件)
AVFoundation是一个先进的Cocoa框架。要有效地使用它,您必须拥有:
- 对基本的可可开发工具和技术的理解
- 基本掌握的blocks
- 键值编码 和键值观察的基本理解
- 对于回放,对核心动画的基本理解(参见 核心动画编程指南 ,或者,对于基本的回放, AVKit Framework Reference。
See Also(参见)
有几个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。
.