AVFoundation系列九:AssetMetaData元資料、音樂封面
阿新 • • 發佈:2018-12-22
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 官網文件有個錯誤:
效果圖: