[AVFoundation]介绍
原文:AVFoundation Programming Guide
写在前面
简单翻译一下
AVFoundation
的相关文档,本人英语水平一般,有不对的欢迎大家留言指正。
正文
AVFoundation是用来播放和创建基于时间的视听媒体的框架之一。它提供了一个操作视听媒体的接口。你可以使用它来检测、创建、编辑或重新编码媒体文件。你也可以从设备中获得输入流以及在拍摄、回放时操作视频。
Figure I-1 shows the architecture on iOS.
Figure I-1 AVFoundation stack on iOS
Figure I-2 shows the corresponding media architecture on OS X.
Figure I-2 AVFoundation stack 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
来获取这个值。
播放
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
向用户展示摄像头录制的东西。
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。这是一个常见的开发需求,这个例子包含了这个功能。