在Swift 4中合并两个视频?

在Swift 4中合并两个视频?,swift,video,avfoundation,avassetexportsession,Swift,Video,Avfoundation,Avassetexportsession,所以我有两个.mp4已经录制并存储在应用程序中,我想将一个附加到另一个,并导出为新视频。这有点效果,但不是很好 let composition = AVMutableComposition() var track = composition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID:Int32(kCMPersistentTrackID_Invalid)) let videoAss

所以我有两个.mp4已经录制并存储在应用程序中,我想将一个附加到另一个,并导出为新视频。这有点效果,但不是很好

    let composition = AVMutableComposition()
    var track = composition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID:Int32(kCMPersistentTrackID_Invalid))

    let videoAsset = AVAsset(url: AAA as URL) as AVAsset
    let videoAsset2 = AVAsset(url: BBB as URL) as AVAsset
    do {
        try track?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset.tracks(withMediaType: AVMediaType.video)[0] as AVAssetTrack, at: kCMTimeZero)
        try track?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset2.tracks(withMediaType: AVMediaType.video)[0] as AVAssetTrack, at: kCMTimeZero)

    } catch {
        print("darn")
    }

    let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality)
    exporter?.outputURL = CCC
    exporter?.outputFileType = AVFileType.mp4
    exporter?.shouldOptimizeForNetworkUse = true


    exporter?.exportAsynchronously {
        print("done?")
    }

这种方式结合了视频,但在两个剪辑之间添加了大量的黑屏,并删除了音频。我找不到这个问题的最新答案。谢谢你的帮助

视频时间线看起来有误,例如,您在同一时间点零插入两个视频,并且对
videoAsset2
使用了错误的持续时间

缺少音频是因为您没有在合成中插入任何音频曲目

尝试类似以下(重复)片段的内容:

// video
try track?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset.tracks(withMediaType:.video)[0] as AVAssetTrack, at: kCMTimeZero)
try track?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset2.duration), of: videoAsset2.tracks(withMediaType:.video)[0] as AVAssetTrack, at: videoAsset.duration)

// audio
try track?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: videoAsset.tracks(withMediaType:.audio)[0] as AVAssetTrack, at: kCMTimeZero)
try track?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset2.duration), of: videoAsset2.tracks(withMediaType:.audio)[0] as AVAssetTrack, at: videoAsset.duration)

免责声明:我不确定使用
AVAssetTrack
拥有的
AVAsset
持续时间作为音轨长度的代理是否是一种好的做法。也许你应该使用
AVAssetTrack.timeRange

请从UI添加屏幕截图将视频放入阵列中,然后尝试此阵列合并