GPUImage icon indicating copy to clipboard operation
GPUImage copied to clipboard

unable to save fitler video using GPUImageMovieWriter in swift

Open dhavalagile opened this issue 7 years ago • 1 comments

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)")
}

dhavalagile avatar Apr 22 '17 08:04 dhavalagile

@dhavalagile Have you found any solution?

khush004 avatar Nov 24 '18 06:11 khush004