iOS资源和元数据
LeonardoTed
9年前
<p>直到iOS4.0开始,AV Foundation才以现在的模样出现在开发者面前,该版本带给开发者一个非常大的而且可扩展的框架,包括对媒体资源的捕捉,组合,播放和处理等大量功能.同时有别于传统面向文件的音频处理方式,框架的代码设计围绕”资源(assert)”进行.</p> <h2>1. 资源的含义</h2> <p>AV Foundation中最重要的类就是AVAsset,它是AV Foundation设计的核心.AVAsset是一个不可变的抽象类,定义了媒体资源的混合呈现方式,将媒体资源的静态属性模块化为一个整体,比如标题,时长和元数据等.</p> <p>AVAsset提供了对基本媒体格式的层次抽象,这意味着无论是处理QuickTime,,MPEG-4还是MP3,对开发者而言,面对的只有资源这个概念,不需要考虑多种编解码器和容器格式的困扰.当然,如果需要获取这些细节信息,也有其他方法可以获取.</p> <p>此外,AVAsset隐藏了资源的位置信息,当处理一个现有媒体对象时,会通过URL进行初始化创建,这个地址可能是本地URL,也可能是一个远程音频流或视频流的URL.</p> <p>AVAsset会把你从这么细节中解脱出来,这样可以确保合理地获取及加载媒体资源.由于不考虑媒体格式及位置等复杂问题,AVAsset为开发者处理时基媒体(timed media)提供了一种简单统一的方式.</p> <p>AVAsset本身并不是媒体资源,但是它可以作为时基媒体的容器.它由一个或多个带有描述自身元数据的媒体(AVAssetTrack)组成.开发者使用AVAssetTrack类表示保存在资源中的统一类型媒体,并对每个资源建立相应的模型.AVAssetTrack最常见的信贷就是音频和视频流,但是它还可以用来表示文本,副标题或隐藏字幕等媒体类型.</p> <p>资源的曲目可通过其tracks属性访问,该属性返回一个NSArray,包含专辑的所有曲目.此外,AVAsset还可以通过标识符,媒体类型或媒体特征等信息找到相应的曲目.</p> <h2>2. 创建资源</h2> <p>可以通过本地文件URL或者远程资源的URL来创建一个AVAsset对象:</p> <pre> <code class="language-objectivec">let assetURL = NSURL(string: "http://coderzhang.xyz/wp-content/uploads/2016/05/transitionApis.jpg") let asset = AVAsset(URL: assetURL!) </code></pre> <p>AVAsset是一个抽象类,这意味着它不能直接被实例化.所以当使用assetURL实际上创建的是其子类AVURLAsset的实例.这个类允许通过传递选项字典来控制创建资源的细节.比如创建一个用在音频或视频编辑场景中的资源,可能希望传递一个选项(option)来告诉程序提供更精确的时长和计时信息:</p> <pre> <code class="language-objectivec">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) </code></pre> <p>该options表明程序可以加载稍微长一点时间,以获取更精确的时长及时间信息.</p> <p>在iOS设备中,开发者可能希望在用户的照片库中访问视频文件,或者在iPod库中访问歌曲.在Mac中,开发者可能希望在用户的iTunes库中找到媒体.借助于iOS和OS X中的一些可用辅助框架,我们可以很方便的访问使用这些媒体资源.</p> <h2>2.1 iOS Assets库</h2> <p>用户使用系统自带的Camera程序或第三方视频捕捉程序捕捉的视频,通常保存在用户的照片库中.iOS提供的Asserts框架可以实现照片库的读写功能.下例从用户资源库中的视频创建一个AVAsset:</p> <pre> <code class="language-objectivec">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) } </code></pre> <h2>2.2 iOS iPod库</h2> <p>获取媒体的一个场景位置是用户的iPod库.MediaPlayer框架提供了对应的API,实现在这个库中查询和获取条目.当找到需要的条目时,可以获取其URL并使用这个URL创建资源,如下例所示:</p> <pre> <code class="language-objectivec">let query = MPMediaQuery() for item in query.items! { print(item.title) } </code></pre> <h2>3. 异步载入</h2> <p>AVAsset有许多有用的方法和属性,可以提供有关资源的信息,比如时长,创建日期和元数据等.AVAsset会延迟载入资源的属性,即直到请求时才会加载相关资源信息.</p> <p>AVAsset和AVAssetTrack都采用了AVAsynchronousKeyValueLoading协议,该协议提供了异步查询属性的方法.</p> <h2>4. 元数据</h2> <p>虽然存在多种格式的媒体资源,但是Apple环境下主要的媒体类型有4种,分别是:QuickTime(mov),MPEG-4 video(MP4和M4V),MPEG-4 audio(m4a)和MPEG-layer III audio(mp3).虽然AVFoundation处理这些元数据时都使用一个接口,但不同类型资源的元数据的存储方式和存储位置还是有区别的,这里不做赘述.</p> <p> </p> <p>来自: <a href="/misc/goto?guid=4959673503941742630" rel="nofollow">http://coderzhang.xyz/2016/05/21/资源和元数据/</a></p> <p> </p>