使用Swift快速剪辑MKV文件

时间:2019-05-04 06:49:07

标签: swift macos video

我正在修剪视频文件。 mov文件一切正常,但mkv文件一切正常。下面是代码。 问题是assetVideoTrack即将失效。 Mac不支持mkv文件。我尝试将mkv文件在线转换为mov文件,然后尝试使用代码修剪视频,但仍然失败。

func trimVideo(sourceURL: URL, destinationURL: URL, trimPoints: TrimPoints, completion: TrimCompletion?) {


    let options = [
        AVURLAssetPreferPreciseDurationAndTimingKey: true
    ]

    let asset = AVURLAsset(url: sourceURL, options: options)
    let preferredPreset = AVAssetExportPresetPassthrough

    if  verifyPresetForAsset(preset: preferredPreset, asset: asset) {

        let composition = AVMutableComposition()
        let videoCompTrack = composition.addMutableTrack(withMediaType: .video, preferredTrackID: CMPersistentTrackID())
        let audioCompTrack = composition.addMutableTrack(withMediaType: .audio, preferredTrackID: CMPersistentTrackID())



       guard let assetVideoTrack: AVAssetTrack = asset.tracks(withMediaType: .video).first else { return }
        guard let assetAudioTrack: AVAssetTrack = asset.tracks(withMediaType: .audio).first else { return }

        var accumulatedTime = kCMTimeZero
        for (startTimeForCurrentSlice, endTimeForCurrentSlice) in trimPoints {
            let durationOfCurrentSlice = CMTimeSubtract(endTimeForCurrentSlice, startTimeForCurrentSlice)
            let timeRangeForCurrentSlice = CMTimeRangeMake(startTimeForCurrentSlice, durationOfCurrentSlice)

            do {
                try videoCompTrack!.insertTimeRange(timeRangeForCurrentSlice, of: assetVideoTrack, at: accumulatedTime)
                try audioCompTrack!.insertTimeRange(timeRangeForCurrentSlice, of: assetAudioTrack, at: accumulatedTime)
                accumulatedTime = CMTimeAdd(accumulatedTime, durationOfCurrentSlice)
            }
            catch let compError {
                completion?(compError)
            }
        }

        guard let exportSession = AVAssetExportSession(asset: composition, presetName: preferredPreset) else { return }

        exportSession.outputURL = destinationURL as URL
        exportSession.outputFileType = AVFileType.m4v
        exportSession.shouldOptimizeForNetworkUse = true

        exportSession.exportAsynchronously {
            completion?(exportSession.error)
        }
    }
    else {
        completion?(error)
    }

}

0 个答案:

没有答案