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

标签 ios swift video-processing

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

*▿ 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...

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

关于ios - Swift 4 insertTimeRange 添加视频轨道但播放时除了第一个不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50041901/

相关文章:

ios - 更改 uitextfield 的外观

c++ - 在 XCode 中桥接 C++ 和 Swift,正确的build设置是什么?

ios - 适用于 iOS 的 ffmpeg 替代品

video - 更改视频分辨率 ffmpeg

image - 如何在 OpenCV Python 中对附近的轮廓进行分组? - 斑马线检测

ios - NumberFormatter 和货币字符串的欧元错误

ios - 在 post 方法中发送标题

swift - 按字母顺序键将数组插入 swift 字典

ios - uiviewcontroller alloc 在访问时更改 setter/getter 值?

objective-c - 关闭 AlertView 时显示新 View