Swift 4 insertTimeRange 添加视频轨道但播放时除了第一个不显示

Swift 4 insertTimeRange adds video tracks but when playing does not show except 1st one

以下函数 "func mergeVideos()" 读取预先录制的视频文件,并制作一个新的电影文件,其中包含用这些文件创建的曲目。 dump(mixComposition.tracks returns 以下为两个视频文件轨道。

*▿ 2 elements
- <AVMutableCompositionTrack: 0x14661a30 trackID = 1, mediaType = vide,    editCount = 1> #0
 - super: AVCompositionTrack
  - super: AVAssetTrack
    - super: NSObject
- <AVMutableCompositionTrack: 0x14592bc0 trackID = 2, mediaType = vide, editCount = 1> #1
- super: AVCompositionTrack
  - super: AVAssetTrack
    - super: NSObject*

问题写好了,新创建的视频的播放时长和第一个视频的时长一样长。添加视频的插入时间和时长如下,没有问题。

▿ 2 elements
  - "1.mp4"
  - "video.mp4"

First video's insert and duration.
time= (0.0, 5.2316666666666665)
Second video's insert and duration.
time= (5.2316666666666665, 5.4366666666666665)

经过几个小时的搜索,我们找不到类似的问题,所以决定问一下。

func mergeVideos(){

    let mixComposition = AVMutableComposition.init()
    var timeRange: CMTimeRange!
    var insertTime = kCMTimeZero



    for k in 0..<videoListOnDisk.count {

        let url = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]).appendingPathComponent(videoListOnDisk[k])

        let videoAsset = AVURLAsset(url: url)

        let track = mixComposition.addMutableTrack(withMediaType: AVMediaType.video,
                                                preferredTrackID: Int32(kCMPersistentTrackID_Invalid))

        timeRange = CMTimeRangeMake(kCMTimeZero,videoAsset.duration ) 


        do {

            try track?.insertTimeRange(timeRange, of: videoAsset.tracks(withMediaType: .video)[0], at: insertTime) 

            } catch let error as NSError {

                print("error when adding video to mix = \(error)")

            }

       insertTime = CMTimeAdd(insertTime, videoAsset.duration)

    }



   dump(mixComposition.tracks)



    let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality)

    exporter!.outputURL = fileURL(combinedVideoFileName)
    exporter!.outputFileType = AVFileType.mp4
    exporter!.shouldOptimizeForNetworkUse = false

    exporter!.exportAsynchronously() {
        DispatchQueue.main.async(execute: { () -> Void in

            print("I am done with exporting \(exporter?.status.rawValue)")

        })

    }     

}

问题是这一行的重复:

let track = mixComposition.addMutableTrack...

将它放在循环之前,这样您就可以只创建 一个 视频轨道并将 所有 视频剪辑插入 一个轨道。