将AVTimedMetadataGroup添加到AVMutableComposition以在(临时)视频中创建章节标记

时间:2017-04-13 15:17:45

标签: swift xcode macos swift3 avfoundation

我正在尝试将章节添加到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)

2 个答案:

答案 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

简要介绍了这一点