iOS資源和元數據

LeonardoTed 8年前發布 | 11K 次閱讀 MacOS 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/資源和元數據/

 

 本文由用戶 LeonardoTed 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!