1. 程式人生 > >AVFoundation系列九:AssetMetaData元資料、音樂封面

AVFoundation系列九:AssetMetaData元資料、音樂封面

AVAsset 中可能包含,以下資訊:

 let file = Bundle.main.path(forResource: "肖央,黃明志 - 不想上班", ofType: "mp3")
        let url = URL.init(fileURLWithPath: file!)
        let asset = AVAsset.init(url: url)

第一種辦法:利用commonMetadata屬性

 let metadata = asset.commonMetadata

處理元資料

func processMetaData(_ metadata:[AVMetadataItem
]){ print("====================",metadata.count) // process format-specific metadata collection //上文我們獲取到多個 metadataitem //列印所有 item 資訊 for (i,item) in metadata.enumerated(){ print("all\(i)\n",item.commonKey,item.identifier) }
//下面對 metadataitem 進行過濾 //獲取特定 metaData //標題 let titleID = AVMetadataIdentifier.commonIdentifierTitle let titleItems = AVMetadataItem.metadataItems(from: metadata, filteredByIdentifier: titleID) if let item = titleItems.first { // process title item
print("title\n",item.commonKey,item.identifier,item.stringValue) } //封面 // Filter metadata to find the asset's artwork let artworkItems = AVMetadataItem.metadataItems(from: metadata, filteredByIdentifier: AVMetadataIdentifier.commonIdentifierArtwork) DispatchQueue.main.async { if let artworkItem = artworkItems.first { // Coerce the value to an NSData using its dataValue property if let imageData = artworkItem.dataValue { let image = UIImage(data: imageData) self.imgV?.image = image // process image } else { // No image data found } } } }

log資訊如下:

all0
         Optional(__C.AVMetadataKey(_rawValue: title)) Optional(__C.AVMetadataIdentifier(_rawValue: id3/TIT2))
         all1
         Optional(__C.AVMetadataKey(_rawValue: albumName)) Optional(__C.AVMetadataIdentifier(_rawValue: id3/TALB))
         all2
         Optional(__C.AVMetadataKey(_rawValue: artist)) Optional(__C.AVMetadataIdentifier(_rawValue: id3/TPE1))
         all3
         Optional(__C.AVMetadataKey(_rawValue: artwork)) Optional(__C.AVMetadataIdentifier(_rawValue: id3/APIC))
         title
         Optional(__C.AVMetadataKey(_rawValue: title)) Optional(__C.AVMetadataIdentifier(_rawValue: id3/TIT2)) Optional("不想上班")

第二種辦法:loadValuesAsynchronously方法

關鍵 key:availableMetadataFormats

//獲取所有的元資料集合
            asset.loadValuesAsynchronously(forKeys: [formatsKey]) { [unowned self] in
                var error: NSError? = nil
                let status = asset.statusOfValue(forKey: formatsKey, error: &error)
                if status == .loaded {
                    for format in asset.availableMetadataFormats {
                        let metadata = asset.metadata(forFormat: format)
                        self.processMetaData(metadata)
                    }
                }
            }

processMetaData 方法同上
log 資訊如下:

 /*
         
          第二種 log 資訊如下
         ==================== 7
         all0
         nil Optional(__C.AVMetadataIdentifier(_rawValue: id3/TSSE))
         all1
         Optional(__C.AVMetadataKey(_rawValue: artwork)) Optional(__C.AVMetadataIdentifier(_rawValue: id3/APIC))
         all2
         Optional(__C.AVMetadataKey(_rawValue: albumName)) Optional(__C.AVMetadataIdentifier(_rawValue: id3/TALB))
         all3
         Optional(__C.AVMetadataKey(_rawValue: title)) Optional(__C.AVMetadataIdentifier(_rawValue: id3/TIT2))
         all4
         nil Optional(__C.AVMetadataIdentifier(_rawValue: id3/COMM))
         all5
         nil Optional(__C.AVMetadataIdentifier(_rawValue: id3/TPOS))
         all6
         Optional(__C.AVMetadataKey(_rawValue: artist)) Optional(__C.AVMetadataIdentifier(_rawValue: id3/TPE1))
         title
         Optional(__C.AVMetadataKey(_rawValue: title)) Optional(__C.AVMetadataIdentifier(_rawValue: id3/TIT2)) Optional("不想上班")

         */

結論:利用第一種方法可以滿足大部分需求,通過 formartkey 可以獲取 asset 的所有資訊。

此外:apple 官網文件有個錯誤:
在這裡插入圖片描述

效果圖:
在這裡插入圖片描述