原文:AVFoundation Programming Guide
写在前面
简单翻译一下
AVFoundation
的相关文档,本人英语水平一般,有不对的欢迎大家留言指正。
正文
AVFoundation是用来播放和创建基于时间的视听媒体的框架之一。它提供了一个操作视听媒体的接口。你可以使用它来检测、创建、编辑或重新编码媒体文件。你也可以从设备中获得输入流以及在拍摄、回放时操作视频。
Figure I-1 shows the architecture on iOS.
Figure I-2 shows the corresponding media architecture on OS X.
通常情况下你应该使用最上层的抽象方法来实现你想处理的任务。
如果你只是简单的想播放电影,可以使用AVKit framework。
在iOS上,在录制视频时,如果你只是需要进行一些简单的控制,可以使用UIKit framework (UIImagePickerController)
注意,AV Foundation上的一些原始数据结构,包含时间相关的数据结构和不透明的对象来描述媒体数据,在Core Media framework中有声明。
概览
AVFoundation framework包含两个方面的内容。一个是视频APIs,一个是音频APIs。旧的音频相关的类提供了简单的处理音频方法。它们描述在Multimedia Programming Guide,本文档不做描述。
- 播放音频文件,可以使用AVAudioPlayer。
- 录制音频文件,你可以使用* AVAudioRecorder*。
你可以使用AVAudioSession来配置应用中的音频属性。详情可以查看 Audio Session Programming Guide。
使用AVFoundation展现和操作媒体
AV Foundation framework使用基础类AVAsset来描述媒体。这个framework很大程度上是根据AVAsset
来设计的。了解它的数据结构有助于了解这个framework是怎么工作的。一个AVAsset
实例是一个包含了一个或者多个媒体数据(音频和视频的tracks
)的集合。它提供集合的整体信息,如标题,时长,大小和其他信息。AVAsset
不绑定特定的数据格式。AVAsset
是其他类的基类,用于通过一个URL创建媒体和创建新的组件(参考Editing
)。
在asset中的每一个单独的媒体数据,都有一个统一的格式和一个相应的track
。在通常的情况下,一个track
代表音频组件,另一个代表视频组件。在一个混合组件中,音频和视频可能包含多个重叠的tracks
。Assets也有元数据。
在AV Foundation中的一个重要概念是,初始化一个asset
或者track
并不意味它是可以使用的,他可能需要一些时间来计算一个item的持续时间(例如,一个MP3文件,可能没有描述信息)。在计算时不应该阻塞当前线程,你应该使用异步的block
来获取这个值。
相关内容: Using Assets, Time and Media Representations
播放
AVFoundation允许你通过精细的方法来管理asset
的播放。为了实现这个,它从asset
上分离了它的表现状态。这允许你可以同时播放同一个asset
的两个不同片段,在不同的分辨率下。这个asset的状态是被player item对象管理着。asset
中的每个track
的状态是由player item track
对象管理。使用player item
和player item track
你可以设置item的size,设置在播放中应用的音频的混合参数和视频组合设置,或者禁止asset
中部分组件的使用。
你可以使用player对象来播放player items
,还可以直接把player输出到Core Animation layer。你还可以使用player queue
来按顺序播放内容。
相关内容:Playback
读取、写入、重新编码Assets
AVFoundation让你可以通过多种方法创建一个新的asset
。你可以方便的对一个现有的asset
重新编码,在IOS4.1及以上,你可以操作asset
上的内容,并且保存在一个新的asset
上。
你可以使用export session
重新编码一个现有的asset
到一些常用的预设置格式。如果你需要更多的控制格式转换, 在IOS4.1及以上,你可以使用asset reader
和asset writer
对象来将asset转换为另一种格式。使用这些对象,你可以选择一个你想要输出的track
,指定你的输出格式,或者在转换过程中修改asset
。
要产生一个可视化的waveform,你可以使用asset reader
来读取音频track
。
相关内容: Using Assets
略缩图
你可以使用AVAssetImageGenerator对象来获取你想要的略缩图。
相关内容: Using Assets
编辑
AVFoundation使用compositions
以现有的媒体来创建新的assets
(通常是,一个或多个视频和音频的tracks
)。你使用可变的composition
来增加和减少tracks
,和调整他们的时间排序。你同时可以设置相关的音量和音频轨道率;设置视频的透明度和透明率。一个composition
是在内存里是一个多个媒体的集合。当然你使用export session
输出一个composition
,它将导入到一个文件。
你还可以使用asset writer
通过临时缓存或者静止图像来创建asset
。
相关内容:Editing
Still and Video Media Capture
摄像头和麦克风的输入是通过capture session
来管理的。一个capture session
协调从输入设备到输出设备的数据流,如电影文件。你可以配置不同的输入和输出到一个单独的session
。甚至这个session
是运行中的。你发送消息到session
来启动和结束数据流。
另外,你可以使用preview layer
向用户展示摄像头录制的东西。
相关内容:Still and Video Media Capture
AVFoundation并发程序设计
AVFoundation的回调---block,kvo,notification
---并不是在任何特定的线程或队列。而是,在它处理内部任务的线程上或者队列上调用。
notifications和threading有两个准则
- UI相关的notifications发生在主线程
- 如果方法和类在特定的queue上时,notifications会发生在这个queue上
所以,你不应该认为notifications在任何特定的线程上返回。
如果你写一个多线程应用,你可以使用NSThread
的 isMainThread
或[[NSThread currentThread] isEqual:<#A stored thread reference#>]
方法
来检测调用的线程是否是你期望的一个线程来执行你的工作。你可以重定向到合适的线程,使用这些方法 如performSelectorOnMainThread:withObject:waitUntilDone:
和performSelector:onThread:withObject:waitUntilDone:modes:
。同样,你也可以使用dispatch_async
来处理。更多的关于并发的操作,请看Concurrency Programming Guide。关于block,请看Blocks Programming Topics。AVCam-iOS: Using AVFoundation to Capture Images and Movies 示例代码介绍了所有的AVFoundation功能并且可以作为AVFoundation中线程和队列使用的参考实例。
预备知识
AVFoundation是Cocoa framework里一个高级的框架。为了更好的使用它,你需要有:
熟练使用基本的Cocoa开发工具和技术
需要掌握block基础的知识
理解kvc和kvo
对于playback,需要了解Core Animation (参考 Core Animation Programming Guide,playback参考AVKit Framework Reference).
更多
这里有一些AVFoundation列子,可以帮助你理解和实现Camera capture。
AVCam-iOS: Using AVFoundation to Capture Images and Movies
AVCamManual: Extending AVCam to Use Manual Capture API
AVLocationPlayer: Using AVFoundation Metadata Reading APIs
RosyWriter是一个演示实时帧处理的示例,特别是如何在视频内容中应用filters。这是一个常见的开发需求,这个例子包含了这个功能。