AVAsset简介
AVFoundation最重要的类就是AVAsset,它是AVFoundation设计的核心,在几乎所有和功能的开发中扮演至关重要的角色。AVAsset是一个抽象类和不可变类,定义了媒体资源混合呈现的方法,将媒体资源的静态属性模块化一个整体,比如他们的标题,时长和元数据等,明确理解AVAsset的目标和功能对成功应用AVFoundation非常重要.
AVAsset不需要考虑媒体资源所具有的两个重要范畴,第一个是它提供了对基本媒体格式的层抽象,无论什么格式,对于你和框架面对的只有资源这个概念。
AVAsset本身并不是媒体资源,但是它可以作为时基媒体容器,它由一个或多个带有描述自身元数据的媒体组成,我们使用AVAssetTrack类代表保存在资源中的统一类型媒体,并对每个资源建立相应的模型。AVAssetTrack最常见的形态就是音频流和视频流,但是它还可以用于诸如文本,副标题或隐藏字幕等媒体类型,如图所依

资源的曲目可通过器track属性进行访问,对该属性的请求会返回一个数组,该数组的元素就是专辑所包含的所有曲目。此外AVAsset还可以通过标识符,媒体类型或媒体特征等信息找到相应的曲目。
创建资源
NSUrl *assetUrl
AVAsset *asset = [AVAsset assetWithURL: assetUrl];
//AVAsset抽象类,通过assetWithURL创建的对象实际上是创建的是AVURLAsset的对象
NSDictionary *options = @{AVURLAssetPreferPreciseDurationAndTimingKey:@YES}
AVURLAsset *asset = [AVURLAsset URLAssetWithURL: assetUrl options: options ]
options获取资源的时长,传递该选项就暗示了开发者希望得到稍长一点的加载时间,以获取更准确的时长和时间信息。
AssetsLibrary//已经废除了
//MediaPlayer //Photos
异步加载资源
AVAsset使用一种高效的设计方法,即延迟载入资源的睡醒,知道请求时才载入。这样可以快速创建资源,而不用考虑因为立即载入相关媒体或元数据所带来的问题。有一点,属性的访问总是同步发生的,如果正在请求的属性没有预先载入,程序就会阻塞,知道可以做出适当的响应。要解决这个问题,应该使用异步的方法来查询资源的属性。
AVAsset和AVAssetTrack都采用了AVAsynchornousKeyValueLoading协议,该协议通过下面给出的方法实现了一步查询属性的功能:
NSURL *assetUrl = [[NSBundle mainBundle] URLForResource:@"崔健-假行僧" withExtension:@"mp3"];
AVAsset *asset = [AVAsset assetWithURL:assetUrl];
NSArray *keys = @[@"tracks"]; //kVC,tracks为AVAsset的属性
[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{
NSError *error;
AVKeyValueStatus status = [asset statusOfValueForKey:@"tracks" error:&error];
switch (status) {
case AVKeyValueStatusLoaded:
//已经加载,继续处理
NSLog(@"loaded");
NSLog(@"%@",asset.tracks);
break;
case AVKeyValueStatusFailed:
NSLog(@"failure");
break;
case AVKeyValueStatusCancelled:
NSLog(@"canceld");
break;
case AVKeyValueStatusUnknown:
NSLog(@"unknown");
break;
default:
NSLog(@"default");
break;
}
}];
可使用statusOfValueForKey: error:方法查询一个给定属性的状态,该方法会返回一个枚举类型的AVKeyValueStatus值,用于表示当前所请求的属性的状态。如果状态不是AVKeyValueStatusLoaded,意味着此时请求该属性可能导致程序卡杜,需要异步载入一个给定的属性,可以调用loadValuesAsynchronouslyForKeys: completionHandler:方法,为其提供一个具有一个或多个key的数组(资源的属性名)和一个completionHandler块,当资源处于回应请求状态时,就会回调这个块方法。
1.completionHandler可能会在任意一个队列中被调用,在对用户界面做出相应更新之前,必须先回到主队列中。
2.在请求多个属性时,每次调用loadValuesAsynchronouslyForKeys: completionHandler:方法只会调用一次completionHandler,调用该方法的次数并不是根据传递给这个方法的键的个数决定的。
3.需要为每个请求的属性调用statusOfValueForKey: error:不能假设所有属性都返回相同的状态值。
媒体元数据
对于元数据的使用有一定的挑战,每个媒体类型就具有唯一的格式,并且通常要求开发者对相应格式读写操作的底层技术有所了解。
AVFoundation提供一套统一的方法,用来处理媒体元数据,可以让开发者不需要考虑大多数特定格式的细节。
Apple环境下遇到的媒体类型主要有4种,分别是:QuickTime(mov)、MPEG-4 video(mp4或m4v)、MPEG-4 Audio(m4a)、MPEG-Layer III audio(mp3)。
网友评论