【问题标题】:Adding AVTimedMetadataGroup to AVMutableComposition to create chapter marks in (temporary) video将 AVTimedMetadataGroup 添加到 AVMutableComposition 以在(临时)视频中创建章节标记
【发布时间】:2017-09-09 19:11:08
【问题描述】:

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

【问题讨论】:

    标签: swift xcode macos swift3 avfoundation


    【解决方案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 再次从此文件中检索元数据。

    【讨论】:

      【解决方案2】:

      似乎无法将AVTimedMetadataGroup 直接添加到 AVComposition,但是您正在组合的视频中存在的任何定时元数据都会通过。

      我已经验证,这适用于使用AVAssetExportSession 导出的作品和使用AVPlayerItemMetadataOutputPushDelegate 播放的作品(尽管我没有专门尝试过章节标记)

      这在 35:50 的 WWDC 2014 Session 505 "Harnessing Metadata in Audiovisual Media" 视频中有简要介绍

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多