如何在iOS Swift中使用GPUImage将亮度添加到4个以上的视频?

时间:2018-02-05 09:43:19

标签: ios iphone swift gpuimage brightness

以下是我将代码应用于多个视频的代码。它适用于3个视频,但对于超过4个视频,GPUImage会使应用程序崩溃。

//arrVideoDetail -> Contains video Data
//isPortrait -> Getting video orientation

    func addBrightNessToVideo(arrVideoDetail:[SelectedAssestData]?,isPortrait:Bool,completion: ((_ updatedVideos:[SelectedAssestData]) -> Void)?){
        SVProgressHUD.show()
        let imageDataGroup: DispatchGroup? = DispatchGroup()
        var updatedVideoDetail = [SelectedAssestData]()
        var arrForRemoveVideosPath = [String]()


        for videoDict in (arrVideoDetail)! {
                let videoDetail = videoDict
                let videoUrl = URL(fileURLWithPath:(videoDetail.DocumentLocalAssetsPath?.path)!)
                let brightNessValue = videoDetail.lightingPercent ?? 0.0
            if brightNessValue == 0 {
                updatedVideoDetail.append(videoDetail)

            }else {
                arrForRemoveVideosPath.append(videoUrl.path)
                imageDataGroup?.enter()

                let movie = GPUImageMovie(url: videoUrl)
                movie?.runBenchmark = true
                movie?.playAtActualSpeed = true
                let brightnessFilter = GPUImageBrightnessFilter()

                // Need to check this value with different different videos

                brightnessFilter.brightness = brightNessValue //videoDetail["brightness"] as! CGFloat // Applying Brightness value

                movie?.addTarget(brightnessFilter)

                let anAsset = AVAsset(url: videoUrl)
                let tracks = anAsset.tracks(withMediaType: AVMediaTypeVideo)
                if(tracks.count>0){
                    let videoAssetTrack = anAsset.tracks(withMediaType: AVMediaTypeVideo)[0]
                    var naturalSize = CGSize()
                    naturalSize = videoAssetTrack.naturalSize //Fetching naturalSize of video
                    var videoWidth:CGFloat!
                    var videoHeight:CGFloat!

                    if isPortrait {
                        videoWidth = 1080
                        videoHeight = 1920
                    }else {
                        videoWidth = 1920
                        videoHeight = 1080
                    }
                    //New path of video where movie created after filter apply
                    let pathToMovie = NSTemporaryDirectory().appending("\(String(NSDate().timeIntervalSince1970)).mov")
                    print(pathToMovie)
                    let filemgr = FileManager.default
                    do {
                        if filemgr.fileExists(atPath: pathToMovie) {
                            try filemgr.removeItem(atPath: pathToMovie)
                        } else {
                            print("\(pathToMovie) not found on applyEffect()")
                        }
                    } catch _ {
                        print("FAIL REMOVE \(pathToMovie) on applyEffect()")
                    }

                    videoDetail.DocumentLocalAssetsPath = URL(fileURLWithPath:pathToMovie)
                    unlink(pathToMovie)
                    //videoDetail["mediaUrl"] = pathToMovie as AnyObject
                    updatedVideoDetail.append(videoDetail)
                    let movieWriter = GPUImageMovieWriter(movieURL: URL(fileURLWithPath:pathToMovie), size: CGSize(width: videoWidth, height: videoHeight))
                    let input = brightnessFilter as GPUImageOutput

                    input.addTarget(movieWriter)
                    movieWriter?.shouldPassthroughAudio = true
                    let orientation =  orientationForAsset(anAsset)
                    let gpuOrientation = imageRotationMode(forUIInterfaceOrientation: orientation)
                    movieWriter?.setInputRotation(gpuOrientation!, at: 0)
                    movieWriter?.enableSynchronizationCallbacks()
                    //Add Audio encoding target if audio available
                    if anAsset.tracks(withMediaType: AVMediaTypeAudio).count > 0 {
                        movie?.audioEncodingTarget =  movieWriter
                    }
                    else
                    {
                        movie?.audioEncodingTarget = nil
                    }

                    print(movieWriter?.assetWriter.status.rawValue)
                    if movieWriter?.assetWriter.status != AVAssetWriterStatus.writing{
                        movieWriter?.startRecording()
                         movie?.startProcessing()
                    }

                    movieWriter?.completionBlock = {
                        print("complete video editing")
                        DispatchQueue.main.async {

                            input.removeTarget(movieWriter)
                            movieWriter?.finishRecording()
                            imageDataGroup?.leave()
                        }
                    }
                }
                else{
                    imageDataGroup?.leave()
                }
            }
    }

低于崩溃 ****由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'*** - [AVAssetWriter startWriting]状态为3时无法调用方法*'

0 个答案:

没有答案