gpt4 book ai didi

avfoundation - 对 AVAssets 进行排序时使用的正确时间范围是多少?

转载 作者:行者123 更新时间:2023-12-03 17:32:34 25 4
gpt4 key购买 nike

我正在处理一个需要对大量短(1-5 秒)进行排序的项目(问题在 n = 30 或更少时可见)AVAsset s。我能找到的所有引用资料和示例项目都指向使用范围 CMTimeRange(start: .zero, end: asset.duration)用于插入合成轨道,因此:

let audioTrack: AVAssetTrack = ...
let videoTrack: AVAssetTrack = ...
var playhead = CMTime.zero

for asset in assets {
let assetRange = CMTimeRange(start: .zero, end: asset.duration)
let (sourceAudioTrack, sourceVideoTrack) = sourceTracks(from: asset)
try! audioTrack.insertTimeRange(assetRange, of: sourceAudioTrack, at: playhead)
try! videoTrack.insertTimeRange(assetRange, of: sourceVideoTrack, at: playhead)
playhead = playhead + assetRange.duration
}


问题是这会导致音频和视频不同步(视频似乎滞后于音频。)一些观察:
  • 当我使用较少的剪辑时,问题似乎消失或不那么严重
  • 剪辑在自己播放时不会表现出这种行为
  • 某些 Assets 具有时间范围不同的视频和音频轨道。我认为这可能是因为讨论的启动框架问题 here
  • 过滤掉轨道长度不同的 Assets 并不能解决问题
  • 时间范围都是由系统在 44100 时间尺度上给出的,因此讨论了时间尺度不匹配/四舍五入 here似乎不适用

  • 我已经测试了许多不同的计算时间范围的策略,但似乎都没有解决问题:

    enum CompositionStrategy: Int, CaseIterable {
    case each // Time range of source video track for video track, audio for audio
    case videoTimeRange // Time range of source video track for both
    case audioTimeRange // Time range of source audio track for both
    case intersection // Intersection of source video and audio time ranges for both
    case assetDuration // (start: .zero, end: asset.duration) for both
    case trim // Apply audio trim from CoreMedia attachments: https://stackoverflow.com/a/33907747/266711
    }

    private static func calculateTimeRanges(strategy: CompositionStrategy, audioRange: CMTimeRange, videoRange: CMTimeRange, audioTrimFromStart: CMTime, audioTrimFromEnd: CMTime, assetDuration: CMTime) -> (video: CMTimeRange, audio: CMTimeRange) {
    switch strategy {
    case .each:
    return (video: videoRange, audio: audioRange)
    case .audioTimeRange:
    return (video: audioRange, audio: audioRange)
    case .videoTimeRange:
    return (video: videoRange, audio: videoRange)
    case .intersection:
    let startTime = max(audioRange.start, videoRange.start)
    let endTime = min(audioRange.end, videoRange.end)
    let range = CMTimeRange(start: startTime, end: endTime)
    return (video: range, audio: range)
    case .assetDuration:
    let range = CMTimeRange(start: .zero, duration: assetDuration)
    return (video: range, audio: range)
    case .trim:
    let audioStart = audioRange.start + audioTrimFromStart
    let audioEnd = audioRange.end - audioTrimFromEnd
    let trimmedAudio = CMTimeRange(start: audioStart, end: audioEnd)
    return (video: videoRange, audio: trimmedAudio)
    }
    }

    (较早片段中的播放头增量会增加为音频和视频时间范围计算的最大值,以防它们不同)

    这些策略都不能解决问题,我正准备联系 Apple 寻求代码级支持,但我希望我错过了一些简单的东西。我还在 Mac 上浏览了 iMovie,它能够完美地排列这些剪辑而没有同步问题,但它看起来不像是在使用 AVComposition支持其预览播放器。我将不胜感激任何帮助。

    最佳答案

    @Jeff,我不知道您是否检查过 Apple 文档,但他们提到如果在此过程中未删除无声样本,则可能会发生恰好 2112 个样本的延迟,因此建议在播放时手动删除系统在两个地方:
    - 首次开始播放时。
    - 当播放位置移动到另一个位置时 - 例如,用户向前或向后跳到媒体的另一部分并从该新位置开始播放

    https://developer.apple.com/library/archive/technotes/tn2258/_index.html

    如果它没有帮助,请提供有关您使用的技术和实现类型的更多详细信息,以便我可以帮助您。

    关于avfoundation - 对 AVAssets 进行排序时使用的正确时间范围是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61737915/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com