Swift:使用AVAssetExportSession()背靠背合并视频

问题描述 投票:0回答:1

我有一个存储为AVURLAsset的视频记录阵列,我想将视频合并到一个剪辑中,以便它们在视频之间没有时间的情况下进行回放。以下是我希望执行的操作,但仅显示第一个视频。注意:我希望视频能够连续播放,并且每个视频之间没有空格。例如,如果未录制电话时在recording1和recording2之间存在实时关系,则输出不应显示此信息。

感谢您的帮助!

func mergeVideos(handler: @escaping (_ asset: AVAssetExportSession)->()) {
    let mixComposition = AVMutableComposition()
    var videoTime = CMTime.zero
    for video in self.recordings {

        let tracks = video.tracks(withMediaType: .video)
        let videoTrack = tracks[0]
        let videoTimeRange = CMTimeRangeMake(start: .zero, duration: video.duration)
        guard let compositionVideoTrack: AVMutableCompositionTrack = mixComposition.addMutableTrack(withMediaType: .video, preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) else { return }
        do {
            try compositionVideoTrack.insertTimeRange(videoTimeRange, of: videoTrack, at: videoTime)
            videoTime = CMTimeAdd(videoTime, video.duration)
        } catch {
            print("An error occurred")
            return
        }
    }

    guard let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .long
    dateFormatter.timeStyle = .short
    let date = dateFormatter.string(from: Date())
    let url = documentDirectory.appendingPathComponent("mergeVideo-\(date).mov")

    guard let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality) else { return }
    exporter.outputURL = url
    exporter.outputFileType = AVFileType.mov
    exporter.shouldOptimizeForNetworkUse = true
    handler(exporter)
}
swift xcode video-processing avassetwriter avassetexportsession
1个回答
0
投票

简单的解决方案在下面的链接中找到。我不得不将AVMutableCompositionTrack移到for循环之外。AVMutableComposition - Only Playing First Track (Swift)

© www.soinside.com 2019 - 2024. All rights reserved.