一、资源AVAsset

AVAsset是一个抽象类和不可变类,定义媒体资源混合呈现的方式,将媒体资源的静态属性模块化成为一个整体,比如标题、时长和元数据等。

AVAsset不需要考虑媒体资源所具有的两个重要范畴:1、提供了对基本媒体格式的层抽象,不需要关注具体格式,只关注资源这个概念。2、隐藏资源的位置信息。

AVAsset本身不是媒体资源,但他可以作为时基媒体的容器,由一个或多个带有描述自身元数据的媒体组成。

AVAssetTrack类代表保存在资源的统一类型媒体,并对每个资源建立相应的模型。

资源的曲目可以通过tracks属性进行访问。

二、创建资源

为现有媒体资源创建AVAsset对象时,可以通过URL对齐进行初始化来实现,可以是本地文件URL,也可以是远程资源的URL

NSString *path = @"";
NSURL *fileUrl = [NSURL fileURLWithPath:path];
NSDictionary *dict = @{AVURLAssetPreferPreciseDurationAndTimingKey : @YES};AVAsset *asset = [AVAsset assetWithURL:fileUrl];

AVAsset是一个抽象类,意味着它不能直接被实例化,使用assetWithURL创建实例时,实际上是创建了他子类AVURLAsset的一个实例。一般会直接创建这个类,因为可以通过传递选项字典来调整资源的创建方式。

NSURL *fileUrl;
NSDictionary *dict = @{AVURLAssetPreferPreciseDurationAndTimingKey : @YES}; AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:fileUrl options:dict];

AVURLAssetPreferPreciseDurationAndTimingKey这个布尔值支出这个asset是否应该准备标出一个准确的时间和提供一个以时间为种子的随机存取。

只是播放asset,options传递nil,或者字典里对应的值是NO(包含在NSValue对象中)

给asset添加一个composition,需要精确的随机存取,传递一个字典,对应值是YES(包含在NSValue对象中)

1、iOS Assets库

用户使用系统子弟的Camera程序或者第三方视频捕捉程序捕捉的侍寝,通常先保存在用户照片库中。iOS提供的Assets库可以实现从照片库这种读写的功能。 iOS9.0以后,<AssetsLibrary/AssetsLibrary.h>被取消。

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {[group setAssetsFilter:[ALAssetsFilter allVideos]];NSLog(@"bbb");if ([group numberOfAssets] > 0) {[group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:0] options:0 usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {if (result) {id representation = [result defaultRepresentation];NSURL *url = [representation url];AVAsset *asset = [AVAsset assetWithURL:url];}}];}} failureBlock:^(NSError *error) {}];

2、iOS iPod库

iPod Library歌曲(也称作本地音乐库歌曲)也就是用户从iTunes中导入的歌曲。MediaPlayer框架提供了API,实现在这个库中查询和获取条目。当需要的条目找到后可以获取其URL并使用这个URL初始化一个资源:

MediaPlayer框架提供了一个名为MPMediaPropertyPredicate的类,它用于构建帮助用户在iPod苦衷查找具体内容所用的查询语句。需要导入库文件<MediaPlayer/MediaPlayer.h>.

MPMediaPropertyPredicate *artistPredicate = [MPMediaPropertyPredicate predicateWithValue:@"刘德华" forProperty:MPMediaItemPropertyArtist];
MPMediaPropertyPredicate *albumPredicate = [MPMediaPropertyPredicate predicateWithValue:@"真永远" forProperty:MPMediaItemPropertyArtist];
MPMediaPropertyPredicate *songPredicate = [MPMediaPropertyPredicate predicateWithValue:@"今天" forProperty:MPMediaItemPropertyArtist];
MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate:artistPredicate];
[query addFilterPredicate:albumPredicate];
[query addFilterPredicate:songPredicate];
NSArray *results = [query items];
if (results.count > 0) {MPMediaItem *item = results[0];NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];AVAsset *asset = [AVAsset assetWithURL:assetURL];}

三、异步载入

AVAsset使用一种高效的设计方法,即延迟载入资源的睡醒,知道请求时才载入。这样可以快速创建资源,而不用考虑因为立即载入相关媒体或元数据所带来的问题。有一点,属性的访问总是同步发生的,如果正在请求的属性没有预先载入,程序就会阻塞,知道可以做出适当的响应。要解决这个问题,应该使用异步的方法来查询资源的属性。

AVAssetAVAssetTrack都采用了AVAsynchornousKeyValueLoading协议,该协议通过下面给出的方法实现了一步查询属性的功能:

NSURL *assetUrl = [[NSBundle mainBundle] URLForResource:@"崔健-假行僧" withExtension:@"mp3"];
AVAsset *asset = [AVAsset assetWithURL:assetUrl];NSArray *keys = @[@"tracks"];[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块,当资源处于回应请求状态时,就会回调这个块方法。

注意:

  • completionHandler可能会在任意一个队列中被调用,在对用户界面做出相应更新之前,必须先回到主队列中。

  • 在请求多个属性时,每次调用loadValuesAsynchronouslyForKeys: completionHandler:方法只会调用一次completionHandler,调用该方法的次数并不是根据传递给这个方法的键的个数决定的。

  • 需要为每个请求的属性调用statusOfValueForKey: error:不能假设所有属性都返回相同的状态值。

四、媒体元数据

对于元数据的使用有一定的挑战,每个媒体类型就具有唯一的格式,并且通常要求开发者对相应格式读写操作的底层技术有所了解。

AVFoundation提供一套统一的方法,用来处理媒体元数据,可以让开发者不需要考虑大多数特定格式的细节。

1、元数据格式

Apple环境下遇到的媒体类型主要有4种,分别是:QuickTime(mov)、MPEG-4 video(mp4或m4v)、MPEG-4 Audio(m4a)、MPEG-Layer III audio(mp3)。

  • QuickTime

  • MPEG-4音频和视频

  • MP3

五、使用元数据

AVAssetAVAssetTrack都可以实现查询相关元数据的功能,大部分情况使用AVAsset提供的元数据,不过涉及获取曲目一级元数据等情况时会使用AVAssetTrack

读取具体资源元数据的接口由AVMetadataItem提供。提供一个面向对象的接口,可以对存储于QuickTime、MPEG-4 atom和ID3帧中的元素进行访问。

  • 键空间(key spaces): AV中使用键空间作为将相关键组合在一起的方法,可以实现对AVMetadataItem实例集合的筛选,每个资源至少包含两个键空间,供从中获取元数据。

common键空间用来定义所有支持的媒体类型的键,包括诸如曲名、歌手和插图信息等常见元素。可以通过查询资源或曲目的[asset commonMetadata]属性从common键空间获取与数据,这个属性会返回一个包含所有可用元数据的数据.

metadataForFormat:访问指定格式的元数据格式,返回一个包含所有相关元数据信息的NSArray。

[asset availableMetadataFormats]返回资源中包含的所有元数据格式

1、查找元数据

2、使用AVMetadataItem

AVMetadataItem最基本的形式是一个封装键值对的封装器。而已通过它查询key或commonKey。value属性被定义成id<NSObject,NSCopying>形式,AVMetadataItem还提供了三个类型强制属性stringValuenumberValuedataValue,如果已经提前知道value类型,可以强制转换。

NSURL *assetUrl = [[NSBundle mainBundle] URLForResource:@"今天" withExtension:@"mp3"];
AVAsset *asset = [AVAsset assetWithURL:assetUrl];for (AVMetadataFormat item in [asset availableMetadataFormats]) {NSArray *medata = [asset metadataForFormat:item];for (AVMetadataItem *mitem in medata) {NSLog(@"%@:%@",mitem.key,mitem.value);}
}//    TPE1:刘德华
//    TALB:真永远
//    TIT2:今天
//    TYER:1995-08-01

六、创建MetaManager应用程序

七、保存元数据

AVAsset是一个不可变类,如果要保存元数据的修改,使用AVAssetExportSession导出一个新的资源副本以及元数据改动。

AVAssetExportSession用于将AVAsset内容根据导出预设条件进行转码,并将导出资源写到磁盘。它提供了多个功能来实现将一种格式转换为另一种格式、修订资源的内容、修改资源的音频和视频行为、写入新的元数据。

创建一个AVAssetExportSession实例需要提供资源和导出预设。导出预设用于确定导出内容的质量、大小等属性。创建导出会话后,还要指定导出内容地址outputURL,并且给出一个outputFileType表示要导出的格式。最后调用exportAsynchronouslyWithCompletionHandler:开始导出。

NSString *presetName = AVAssetExportPresetPassthrough;
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:self.asset presetName:presetName];NSURL *outputUrl ;exportSession.outputURL = outputUrl;
exportSession.outputFileType = @"";
//    exportSession.metadata = [_asset availableMetadataFormats][exportSession exportAsynchronouslyWithCompletionHandler:^{AVAssetExportSessionStatus status = exportSession.status;BOOL success = (status == AVAssetExportSessionStatusCompleted);if (success) {}}];

AVFoundation开发秘籍笔记-03资源和元数据相关推荐

  1. AVFoundation开发秘籍笔记:第5章 AV Kit用法

    第4章中介绍了使用AVPlayer和AVPlayerltem创建一个自定义视频播放器的方法.创建一个自定义视频播放器在很多情况下是需要的,因为这样才可以对所有播放器行为和用户界面进行控制.不过我们是否 ...

  2. AVFoundation开发秘籍笔记:第9章 媒体的組合和編緝

    9.1 組合媒体 想象一下最近如果去一趙旧金山,在那里拍摂了一些金冂公国.日本茶圓和漁人码头的短片.我們希望將这些视頻中的最好镜头组合在一起, 配上合适的音乐,做成一个可与朋友和家人一起分享的影片,如 ...

  3. AVFoundation开发秘籍笔记-06捕捉媒体

    一.捕捉功能 1.捕捉会话 AVCaptureSession AVFoundation捕捉栈的核心类是AVCaptureSession.一个捕捉会话相当于一个虚拟的"插线板",用于 ...

  4. AVFoundation开发秘籍笔记-02播放和录制音频

    一.音频会话 AVAudioSession 音频会话在应用程序和操作系统之间扮演着中间人的角色,提供一种简单实用的方法是OS得知应用程序应该如何与iOS音频环境进行交互. AVAudioSession ...

  5. AVFoundation开发秘籍笔记:第12章 动图层内容

    12.1 Core Animation应用 Core Animation是OS X和iOS平台提供的用于合成和制作动画的框架,苹果平台上面漂亮.流畅的动画效果都是通过这个框架实现的.它提供- -种简 ...

  6. 动态网站开发课后笔记03:Java Web概述

    文章目录 一.Tomcat服务器 (一)初识Tomcat 1.Tomcat概念 2.Tomcat特点 3.Tomcat官网 4.下载Tomcat压缩包 (二)Tomcat安装和启动 1.解压缩Tomc ...

  7. Kinect开发学习笔记之(二)Kinect开发学习资源整理

    Kinect开发学习笔记之(二)Kinect开发学习资源整理 zouxy09@qq.com http://blog.csdn.net/zouxy09 刚刚接触Kinect,在网上狂搜资料,获得了很多有 ...

  8. JavaEE——Spring学习笔记03【AOP开发】

    JavaEE--Spring学习笔记01[Ioc开发的模式] JavaEE--Spring学习笔记02[Spring和Mybatis的整合] JavaEE--Spring学习笔记03[AOP开发] J ...

  9. 数据之道读书笔记-03差异化的企业数据分类管理框架

    数据之道读书笔记-03差异化的企业数据分类管理框架 不同的企业或组织基于不同的目的,可以从多个角度对数据进行分类,如结构化数据和非结构化数据.内部数据和外部数据.原始数据和衍生数据.明细数据和汇总数据 ...

最新文章

  1. 太TM难看了,我自己都看不下去了
  2. 将整数拆分为2的幂次方
  3. DOCTYPE声明作用及用法详解
  4. 登录页面和FORM的职责不对称,处理方法,刷新工作流程
  5. android中编译和使用luajit开发应用,Android 嵌入 LuaJIT 的曲折道路
  6. 在Java中调用祖父母方法:您不能
  7. 电脑生成siri语音_米家智能台灯1S全新升级,支持小爱和Siri的语音控制
  8. SQLSERVER压缩数据文件的用处有多大
  9. 遍历C#属性的通用方法
  10. input file 上传问题
  11. MFC动态链接库和WIN32动态链接库 及区别
  12. Python 语言简介与入门(1)
  13. c语言80c51控制系统设计,89C51单片机的步进电动机控制系统设计
  14. (转)质量的5大手册APQP、PPAP 、FMEA、 SPC 、MSA 是什么意思?
  15. [渝粤教育] 内蒙古大学 微生物学 参考 资料
  16. 计算机与经济学之关联刍议,西方五大经济学期刊发展趋势刍议
  17. CNN | 00卷积神经网络应用
  18. ulimit修改open files永久生效
  19. 读《春秋》有感之十九:晋之霸业衰落
  20. 技嘉主板z490ud更新最新bios,进不去bios了

热门文章

  1. 交流充电桩电路图_详细剖析交流充电桩上电源和RS485隔离原理
  2. PostgreSql pg_rewind
  3. qt 实现导航栏切换页面功能 QStackedLayout
  4. 5GNR漫谈9:PDSCH和PUSCH资源映射(频域type0/type1和时域typeA/typeB/typeC)
  5. c语言求n个数最大最小值,c语言 如何求n个数的最大值 最小值
  6. KITTI如何submit自己的模型效果
  7. TOF,双目,结构光,激光雷达等传感器及相关技术
  8. windows查看密码工具
  9. 香港20年十大最具影响力电影
  10. AS3 setTimeOut、setInterval、Timer 的区别和用法