首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用avfoundation合并视频剪辑?

如何使用avfoundation合并视频剪辑?
EN

Stack Overflow用户
提问于 2019-01-14 19:30:38
回答 1查看 485关注 0票数 0

我已经成功地将视频剪辑合并为单个视频,但我在最终合并的视频中遇到了问题,最终视频在每个视频剪辑结束后显示一个白色帧。我已经尝试了很多次来删除它,但是没有成功。请检查我下面的代码。

代码语言:javascript
复制
func merge(arrayVideos:[AVAsset], completion:@escaping (_ exporter: AVAssetExportSession) -> ()) -> Void {

    let mainComposition = AVMutableComposition()
    let compositionVideoTrack = mainComposition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)
    compositionVideoTrack?.preferredTransform = CGAffineTransform(rotationAngle: .pi / 2)
    let soundtrackTrack = mainComposition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid)
    var time:Double = 0.0

    for (index, videoAsset) in arrayVideos.enumerated() {
        let atTime = CMTime(seconds: time, preferredTimescale: 1)
        try! compositionVideoTrack?.insertTimeRange(CMTimeRangeMake(start: CMTime.zero, duration: videoAsset.duration), of: videoAsset.tracks(withMediaType: .video)[0], at: atTime)
        try! soundtrackTrack?.insertTimeRange(CMTimeRangeMake(start: CMTime.zero, duration: videoAsset.duration), of: videoAsset.tracks(withMediaType: .audio)[0], at: atTime)
        time += videoAsset.duration.seconds
    }

    let outputFileURL = URL(fileURLWithPath: NSTemporaryDirectory() + "merge.mp4")
    print("final URL:\(outputFileURL)")
    let fileManager = FileManager()

    do {
        try fileManager.removeItem(at: outputFileURL)
    } catch let error as NSError {
        print("Error: \(error.domain)")
    }

    let exporter = AVAssetExportSession(asset: mainComposition, presetName: AVAssetExportPresetHighestQuality)
    exporter?.outputURL = outputFileURL
    exporter?.outputFileType = AVFileType.mp4
    exporter?.shouldOptimizeForNetworkUse = true
    exporter?.exportAsynchronously {
        DispatchQueue.main.async {
            completion(exporter!)
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-14 21:23:04

不要使用Double来跟踪插入时间,这可能会由于舍入误差而导致间隙。在转换秒时,不要使用preferredTimescale为1,这将有效地将所有内容舍入为整数秒(对于这种情况,1000将是更常见的时间刻度)。

相反,要跟踪插入时间,请使用初始化为kCMTimeZeroCMTime,并使用CMTimeAdd将其提前。

还有一件事:视频和音频曲目可以有不同的持续时间,特别是在录制的时候。因此,为了保持同步,您可能需要使用CMTimeRangeGetIntersection来获取资源中音频和视频的公共时间范围,然后使用result来插入到合成中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54180669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档