2017-04-13 3 views
2

Ich versuche, Kapitel zu einer AVMutableComposition hinzuzufügen. Das Video wird wie erwartet erstellt und an die gesendet. Wie auch immer, ich möchte Kapitelmarken hinzufügen (um die Kapitelmarkeroption in AVplayer zu verwenden).Hinzufügen von AVTimedMetadataGroup zu AVMutableComposition zum Erstellen von Kapitelmarkierungen in (temporärem) Video

Ich habe Folgendes versucht, um die zeitgesteuerte Metadaten zu erstellen ... aber was zu tun?

Beim Versuch, Metadaten zu AVMutableComposition hinzuzufügen, werden alle Elemente für Metadaten nur abgerufen.

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) 

Wenn dies zu tun, ohne wirklich unmöglich auf der Festplatte zu schreiben ist (was seltsam fühlt) Hilfe mit dem Video mit den Kapiteln Speicher und wäre toll. Da kann ich nur normale Metadaten speichern.

Mit AVAssetExportSession ist es möglich, die Metadaten festzulegen und die neue Komposition in eine Datei zu schreiben, aber es ist nicht möglich, eine AVTimedMetadataGroup zu schreiben?

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

Antwort

0

Ich glaube nicht, dass es möglich ist, zeitgesteuerte Metadaten zu einer Komposition hinzuzufügen. Sie müssen nur mit den Metadaten im Speicher arbeiten, bis Sie sie auf die Festplatte schreiben.

Die einzige Möglichkeit, zeitgesteuerte Metadaten in eine Datei zu schreiben, ist die Verwendung eines AVAssetWriter. Um dies zu tun Sie das Asset Schriftsteller wie gewohnt einrichten müssen, aber dann eine Metadaten-Spur hinzufügen:

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

Dann gründen Sie eine metadataAdaptor und verwenden, die die Metadatengruppen hinzuzufügen, wenn der metadataInput bereit ist.

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

Sie können durch die Verwendung eines AVAssetReaderOutputMetadataAdaptor mit den Metadaten Spur die Metadaten aus dieser Datei wieder abgerufen werden.

Verwandte Themen