AV Foundation (三.资源和元数据)

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访问

你可能感兴趣的:(AV Foundation (三.资源和元数据))