1.AVAsset
AVAsset是一个抽象类,其子类描述了一个媒体资源的元数据,也就是资源信息,真正的媒体资源可以用其属性tracks来访问,这是一个数组,里面的元素是AVAssetTrack的示例,AVAssetTrack是轨道,最常见的有视频轨和音频轨,比如一个视频资源,可能包含了音频轨和视频轨.
1.创建资源
1.1使用URL创建
AVAsset *asset = [[AVURLAsset alloc]initWithURL:[NSURL URLWithString:@""] options:@{AVURLAssetPreferPreciseDurationAndTimingKey:@YES}];
AVURLAssetPreferPreciseDurationAndTimingKey意思是较长的加载时间,可以获取到更多或者更准确的媒体信息
1.2从照片中加载
PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil];
if(result.count){
PHAsset *asset = [result objectAtIndex:0];
[[PHImageManager defaultManager]requestAVAssetForVideo:asset options:nil resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
}];
}
ALAssetsLibrary已经在iOS9开始废弃,所以使用Photos框架.
1.3获取媒体信息
媒体资源的加载是需要时间的,并且不同的属性需要不同的时间,在主线程直接访问的话,可能会导致程序卡顿,因此AVAsset和AVAssetTrack遵循了一个协议,提供了两个方法,statusOfValueForKey用来查询媒体资源的某个属性加载状态,以及loadValuesAsynchronouslyForKeys用来异步获取信息.
[asset loadValuesAsynchronouslyForKeys:@[@"tracks",@"duration"] completionHandler:^{
AVKeyValueStatus state = [asset statusOfValueForKey:@"tracks" error:nil];
AVKeyValueStatus state2 = [asset statusOfValueForKey:@"duration" error:nil];
switch (state2) {
case AVKeyValueStatusFailed:
break;
case AVKeyValueStatusLoading:
break;
case AVKeyValueStatusLoaded:
NSLog(@"%f",CMTimeGetSeconds(asset.duration));
break;
case AVKeyValueStatusCancelled:
break;
default:
break;
}
}];
首先异步获取给定的属性,可以是多个,然后在回调中检查给定属性的查询状态,如果是AVKeyValueStatusLoaded,说明已经获取到了这个属性,需要注意的是,每个给定属性的查询状态可能是不一样的,需要分别检查状态,不过loadValuesAsynchronouslyForKeys的回调只会调用一次.
2.媒体元数据
元数据可能包含了出版商,出版时间等等.通常的开发中,媒体资源可能是没有元数据的
元数据使用AVMetadataItem访问
网友评论