BradLarson / GPUImage

An open source iOS framework for GPU-based image and video processing
http://www.sunsetlakesoftware.com/2012/02/12/introducing-gpuimage-framework
BSD 3-Clause "New" or "Revised" License
20.23k stars 4.61k forks source link

unable to save fitler video using GPUImageMovieWriter in swift #2460

Open dhavalagile opened 7 years ago

dhavalagile commented 7 years ago

i am using Gpuimage filter for apply filter to video. below is my code for brightness filter. video is saved sometime but most of the time movieWritter unable to complete finishRecording or completionBlock while moviefile complete processing. at the end app terminate due to high usage of CPU and Memory usage.

let finalpath = "\(FileManager.default.finalCompositions)/composition\(getTimeStamp).mp4"
 let finalUrl = URL(fileURLWithPath: finalpath)

let asset: AVURLAsset = AVURLAsset(url: self.videoUrl!)
let asetTrack: AVAssetTrack = asset.tracks(withMediaType: AVMediaTypeVideo)[0]

self.exportedMovieFile = GPUImageMovie(url: self.videoUrl)
self.exportedMovieFile?.runBenchmark = true
self.exportedMovieFile?.playAtActualSpeed = false

var exportfilter = GPUImageBrightnessFilter()
exportfilter.brightness = 0.5
self.exportedMovieFile?.addTarget(exportfilter)

let videosize: CGSize = CGSize(width: asetTrack.naturalSize.width, height: asetTrack.naturalSize.height)
 self.exportedMovieWritter = GPUImageMovieWriter(movieURL: finalUrl, size: videosize)

exportfilter.addTarget(self.exportedMovieWritter)

 //Configure this for video from the movie file, where we want to preserve all video frames and audio samples
 self.exportedMovieWritter?.shouldPassthroughAudio = true
if asset.tracks(withMediaType: AVMediaTypeAudio).count > 0 {
     self.exportedMovieFile?.audioEncodingTarget = self.exportedMovieWritter
 }
 else
{
    self.exportedMovieFile?.audioEncodingTarget = nil
}

 self.exportedMovieFile?.enableSynchronizedEncoding(using: self.exportedMovieWritter)

self.exportedMovieWritter!.startRecording()
 self.exportedMovieFile?.startProcessing()

DispatchQueue.main.async {
   self.timerProgress = Timer.scheduledTimer(timeInterval: 0.3, target: self, selector:#selector(self.filterRetrievingProgress), userInfo: nil, repeats: true)
}

 self.exportedMovieWritter?.failureBlock = {(err) in
   loggingPrint("Error :: \(err?.localizedDescription)")
 }

self.exportedMovieWritter?.completionBlock = {() -> Void in
exportfilter.removeTarget(self.exportedMovieWritter)

self.exportedMovieWritter?.finishRecording(completionHandler: {
  self.timerProgress?.invalidate()
    self.timerProgress = nil

   self.exportedMovieFile?.removeAllTargets()
    self.exportedMovieFile?.cancelProcessing()
     self.exportedMovieFile = nil
                DispatchQueue.main.async {

                    let uploadViewController = UploadViewController.loadController()
                    uploadViewController.isPhoto = false
                    uploadViewController.videoUrl = finalUrl
                    self.navigationController?.pushViewController(uploadViewController, animated: true)

                }  
            })
  }

@objc fileprivate func filterRetrievingProgress() {
        loggingPrint("Progess :: \(self.exportedMovieFile?.progress)")
}
khush004 commented 5 years ago

@dhavalagile Have you found any solution?