2017-04-13 41 views
2

我試圖將章節添加到AVMutableComposition。該視頻按預期創建併發送至AVPlayer。我多麼想包含章節標記(使用AVplayer中的章節標記選項)。將AVTimedMetadataGroup添加到AVMutableComposition以在(臨時)視頻中創建章節標記

我試過以下內容來創建定時元數據......但比做什麼?

當試圖將元數據添加到AVMutableComposition時,元數據的所有項目都只能獲取。

let someAsset:AVURLAsset = AVURLAsset(url:URL(fileURLWithPath: "/tmp/temp.mov")) 
let mutableComposition:AVMutableComposition = AVMutableComposition() 
let start: Int64 = 0 
let duration: Int64 = 500 
let timeRange:CMTimeRange = CMTimeRange(start: CMTime(value: CMTimeValue(start), timescale: 1), end: CMTime(value: CMTimeValue(duration), timescale: 1)); 
var timedMetadataItems: [AVTimedMetadataGroup] = [] 

do { 
    try mutableComposition.insertTimeRange(timeRange, of: someAsset, at: mutableComposition.duration) 


    let metadata = AVMutableMetadataItem() 
    metadata.key = AVMetadataQuickTimeUserDataKeyChapter as NSCopying & NSObjectProtocol 
    metadata.value = "Test" as NSCopying & NSObjectProtocol 

    let timedMetadata = AVTimedMetadataGroup(items: [metadata], timeRange: timeRange) 
    timedMetadataItems.append(timedMetadata) 

} catch let error as NSError { 
    Swift.print(error.localizedDescription) 
} 

return AVPlayerItem(asset: mutableComposition) 

如果沒有寫入磁盤這樣做實在是不可能的(什麼感覺怪)拯救與章節的視頻將是巨大的,以及任何幫助。因爲我只能保存正常的元數據。

使用AVAssetExportSession可以設置元數據並將新構圖寫入文件,但不可能編寫AVTimedMetadataGroup

let export = AVAssetExportSession(asset: mutableComposition, presetName: AVAssetExportPresetPassthrough) 

回答

0

我不認爲有可能將定時元數據添加到構圖。您只需在內存中處理元數據,直到將其寫入磁盤。

將定時元數據寫入文件的唯一方法是使用AVAssetWriter。 要做到這一點,你需要建立資產作家像往常一樣,但再添加元數據跟蹤:

let formatDesc = aMetadataGroup.copyFormatDescription() 
let metadataInput = AVAssetWriterInput.init(mediaType: .metadata, outputSettings: nil, sourceFormatHint: formatDesc) 
metadataInput.expectsMediaDataInRealTime = false 
writer?.add(metadataInput) 

然後你建立一個metadataAdaptor並用它來添加元數據組每當metadataInput已準備就緒。

let metadataAdaptor = AVAssetWriterInputMetadataAdaptor.init(assetWriterInput: metadataInput) 
metadataInput.requestMediaDataWhenReady(on: metadataQueue, using: { 
    metadataAdaptor.append(metadataGroup) 
}) 

您可以通過使用一個AVAssetReaderOutputMetadataAdaptor與元數據軌跡再次檢索該文件的元數據。