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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容