转载

iOS资源和元数据

直到iOS4.0开始,AV Foundation才以现在的模样出现在开发者面前,该版本带给开发者一个非常大的而且可扩展的框架,包括对媒体资源的捕捉,组合,播放和处理等大量功能.同时有别于传统面向文件的音频处理方式,框架的代码设计围绕”资源(assert)”进行.

1. 资源的含义

AV Foundation中最重要的类就是AVAsset,它是AV Foundation设计的核心.AVAsset是一个不可变的抽象类,定义了媒体资源的混合呈现方式,将媒体资源的静态属性模块化为一个整体,比如标题,时长和元数据等.

AVAsset提供了对基本媒体格式的层次抽象,这意味着无论是处理QuickTime,,MPEG-4还是MP3,对开发者而言,面对的只有资源这个概念,不需要考虑多种编解码器和容器格式的困扰.当然,如果需要获取这些细节信息,也有其他方法可以获取.

此外,AVAsset隐藏了资源的位置信息,当处理一个现有媒体对象时,会通过URL进行初始化创建,这个地址可能是本地URL,也可能是一个远程音频流或视频流的URL.

AVAsset会把你从这么细节中解脱出来,这样可以确保合理地获取及加载媒体资源.由于不考虑媒体格式及位置等复杂问题,AVAsset为开发者处理时基媒体(timed media)提供了一种简单统一的方式.

AVAsset本身并不是媒体资源,但是它可以作为时基媒体的容器.它由一个或多个带有描述自身元数据的媒体(AVAssetTrack)组成.开发者使用AVAssetTrack类表示保存在资源中的统一类型媒体,并对每个资源建立相应的模型.AVAssetTrack最常见的信贷就是音频和视频流,但是它还可以用来表示文本,副标题或隐藏字幕等媒体类型.

资源的曲目可通过其tracks属性访问,该属性返回一个NSArray,包含专辑的所有曲目.此外,AVAsset还可以通过标识符,媒体类型或媒体特征等信息找到相应的曲目.

2. 创建资源

可以通过本地文件URL或者远程资源的URL来创建一个AVAsset对象:

 let assetURL = NSURL(string: "http://coderzhang.xyz/wp-content/uploads/2016/05/transitionApis.jpg") let asset = AVAsset(URL: assetURL!) 

AVAsset是一个抽象类,这意味着它不能直接被实例化.所以当使用assetURL实际上创建的是其子类AVURLAsset的实例.这个类允许通过传递选项字典来控制创建资源的细节.比如创建一个用在音频或视频编辑场景中的资源,可能希望传递一个选项(option)来告诉程序提供更精确的时长和计时信息:

 let assetURL = NSURL(string: "http://coderzhang.xyz/wp-content/uploads/2016/05/transitionApis.jpg")! let options = [AVURLAssetPreferPreciseDurationAndTimingKey:true] let asset = AVURLAsset(URL: assetURL, options: options) 

该options表明程序可以加载稍微长一点时间,以获取更精确的时长及时间信息.

在iOS设备中,开发者可能希望在用户的照片库中访问视频文件,或者在iPod库中访问歌曲.在Mac中,开发者可能希望在用户的iTunes库中找到媒体.借助于iOS和OS X中的一些可用辅助框架,我们可以很方便的访问使用这些媒体资源.

2.1 iOS Assets库

用户使用系统自带的Camera程序或第三方视频捕捉程序捕捉的视频,通常保存在用户的照片库中.iOS提供的Asserts框架可以实现照片库的读写功能.下例从用户资源库中的视频创建一个AVAsset:

 let library = ALAssetsLibrary() library.enumerateGroupsWithTypes(ALAssetsGroupSavedPhotos, usingBlock: { (group, stop) in     if group != nil {         print(group)         //Filter down to only photos         group.setAssetsFilter(ALAssetsFilter.allPhotos())          //Grab the first photo returned         group.enumerateAssetsAtIndexes(NSIndexSet(index: 0), options: NSEnumerationOptions.Concurrent, usingBlock: { (alAsset, index, innerStop) in             if alAsset != nil {                 let representation = alAsset.defaultRepresentation()                 let url = representation.url()                 let asset = AVAsset(URL: url)                 print(asset)                 //Asset created.Perform some AV Foundation magic             }         })      }      }) { (error) in         print(error.localizedDescription) } 

2.2 iOS iPod库

获取媒体的一个场景位置是用户的iPod库.MediaPlayer框架提供了对应的API,实现在这个库中查询和获取条目.当找到需要的条目时,可以获取其URL并使用这个URL创建资源,如下例所示:

 let query = MPMediaQuery() for item in query.items! {     print(item.title) } 

3. 异步载入

AVAsset有许多有用的方法和属性,可以提供有关资源的信息,比如时长,创建日期和元数据等.AVAsset会延迟载入资源的属性,即直到请求时才会加载相关资源信息.

AVAsset和AVAssetTrack都采用了AVAsynchronousKeyValueLoading协议,该协议提供了异步查询属性的方法.

4. 元数据

虽然存在多种格式的媒体资源,但是Apple环境下主要的媒体类型有4种,分别是:QuickTime(mov),MPEG-4 video(MP4和M4V),MPEG-4 audio(m4a)和MPEG-layer III audio(mp3).虽然AVFoundation处理这些元数据时都使用一个接口,但不同类型资源的元数据的存储方式和存储位置还是有区别的,这里不做赘述.

 

来自: http://coderzhang.xyz/2016/05/21/资源和元数据/

 

正文到此结束
Loading...