AVMutableComposition视频合并中的黑帧

时间:2015-10-06 15:30:39

标签: ios xcode swift gpuimage avmutablecomposition

我使用AVMutableComposition合并三个视频和一个音轨。现在合并的视频在前一秒内包含黑色火焰。

我是这样写的。

        let mixComposition = AVMutableComposition()

        let firstTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo,
            preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
        do {
            try firstTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, firstAsset.duration),
                ofTrack: firstAsset.tracksWithMediaType(AVMediaTypeVideo)[0] ,
                atTime: kCMTimeZero)
        } catch _ {
        }

        let secondTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo,
            preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
        do {
            try secondTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, secondAsset.duration),
                ofTrack: secondAsset.tracksWithMediaType(AVMediaTypeVideo)[0] ,
                atTime: firstAsset.duration)
        } catch _ {
        }

        let thirdTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo,
            preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
        do {
            try thirdTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, thirdAsset.duration),
                ofTrack: thirdAsset.tracksWithMediaType(AVMediaTypeVideo)[0] ,
                atTime: CMTimeAdd(firstAsset.duration ,secondAsset.duration))
        } catch _ {
        }


        let mainInstruction = AVMutableVideoCompositionInstruction()
        mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeAdd(firstAsset.duration, CMTimeAdd(secondAsset.duration, thirdAsset.duration)))

        let firstInstruction = videoCompositionInstructionForTrack(firstTrack, asset: firstAsset)
        let secondInstruction = videoCompositionInstructionForTrack(secondTrack, asset: secondAsset)
        let thirdInstruction = videoCompositionInstructionForTrack(thirdTrack, asset: thirdAsset)

        mainInstruction.layerInstructions = [firstInstruction, secondInstruction, thirdInstruction]
        let mainComposition = AVMutableVideoComposition()
        mainComposition.instructions = [mainInstruction]
        mainComposition.frameDuration = CMTimeMake(1, 30)
        let videoSize = firstTrack.naturalSize
        mainComposition.renderSize = videoSize

        if let loadedAudioAsset = audioAsset {
            let audioTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: 0)
            do {
                try audioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, CMTimeAdd(firstAsset.duration, CMTimeAdd(secondAsset.duration, thirdAsset.duration))),
                    ofTrack: loadedAudioAsset.tracksWithMediaType(AVMediaTypeAudio)[0] ,
                    atTime: kCMTimeZero)
            } catch _ {
            }
        }

        let documentDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateStyle = .LongStyle
        dateFormatter.timeStyle = .ShortStyle
        let date = dateFormatter.stringFromDate(NSDate())
        let savePath = (documentDirectory as NSString).stringByAppendingPathComponent("mergeVideo-\(date).mp4")
        let url = NSURL(fileURLWithPath: savePath)

        let exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality)
        exporter!.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeAdd(firstAsset.duration, CMTimeAdd(secondAsset.duration, thirdAsset.duration)))
        exporter!.outputURL = url
        exporter!.outputFileType = AVFileTypeMPEG4
        exporter!.shouldOptimizeForNetworkUse = true
        exporter!.videoComposition = mainComposition

        exporter!.exportAsynchronouslyWithCompletionHandler() {
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                print("proseed!")
                self.exportDidFinish(exporter!)
            })
        }

此外,源视频文件中的空白帧也不存在。 感谢。

0 个答案:

没有答案