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/資源和元數據/