我正在尝试将章节添加到AVMutableComposition
。视频按预期创建并发送到AVPlayer
。我想如何包含章节标记(使用AVplayer
中的章节标记选项)。
我已经尝试过以下方法来创建定时元数据......但是要做什么?
尝试向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 :(得分:1)
我认为不可能将定时元数据添加到合成中。您必须使用内存中的元数据,直到将其写入磁盘。
将定时元数据写入文件的唯一方法是使用AVAssetWriter
。
为此,您需要像往常一样设置资产编写器,但随后添加元数据轨道:
let formatDesc = aMetadataGroup.copyFormatDescription()
let metadataInput = AVAssetWriterInput(mediaType: .metadata, outputSettings: nil, sourceFormatHint: formatDesc)
metadataInput.expectsMediaDataInRealTime = false
writer?.add(metadataInput)
然后设置metadataAdaptor,并在metadataInput准备就绪时使用它来附加元数据组。
let metadataAdaptor = AVAssetWriterInputMetadataAdaptor(assetWriterInput: metadataInput)
metadataInput.requestMediaDataWhenReady(on: metadataQueue, using: {
metadataAdaptor.append(metadataGroup)
})
您可以使用带有元数据轨道的AVAssetReaderOutputMetadataAdaptor
再次从此文件中检索元数据。
答案 1 :(得分:0)
似乎无法将AVTimedMetadataGroup
直接添加到AVComposition,但是您要合并的视频中存在的任何定时元数据都将通过。
我已经确认这有效(虽然我没有专门针对章节标记)用于导出AVAssetExportSession
和用AVPlayerItemMetadataOutputPushDelegate
WWDC 2014 Session 505 "Harnessing Metadata in Audiovisual Media"视频35:50
简要介绍了这一点