[AVFoundation]介绍

原文:AVFoundation Programming Guide

写在前面

简单翻译一下AVFoundation的相关文档,本人英语水平一般,有不对的欢迎大家留言指正。

正文

AVFoundation是用来播放和创建基于时间的视听媒体的框架之一。它提供了一个操作视听媒体的接口。你可以使用它来检测、创建、编辑或重新编码媒体文件。你也可以从设备中获得输入流以及在拍摄、回放时操作视频。
Figure I-1 shows the architecture on iOS.


[AVFoundation]介绍_第1张图片
Figure I-1 AVFoundation stack on iOS

Figure I-2 shows the corresponding media architecture on OS X.


[AVFoundation]介绍_第2张图片
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来获取这个值。

相关内容: Using Assets, Time and Media Representations

播放

AVFoundation允许你通过精细的方法来管理asset的播放。为了实现这个,它从asset上分离了它的表现状态。这允许你可以同时播放同一个asset的两个不同片段,在不同的分辨率下。这个asset的状态是被player item对象管理着。asset中的每个track的状态是由player item track对象管理。使用player itemplayer 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 readerasset 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在任何特定的线程上返回。

如果你写一个多线程应用,你可以使用NSThreadisMainThread[[NSThread currentThread] isEqual:<#A stored thread reference#>]方法
来检测调用的线程是否是你期望的一个线程来执行你的工作。你可以重定向到合适的线程,使用这些方法 如performSelectorOnMainThread:withObject:waitUntilDone:performSelector:onThread:withObject:waitUntilDone:modes:。同样,你也可以使用dispatch_async来处理。更多的关于并发的操作,请看Concurrency Programming Guide。关于block,请看Blocks Programming TopicsAVCam-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。这是一个常见的开发需求,这个例子包含了这个功能。

你可能感兴趣的:([AVFoundation]介绍)