【问题标题】:GPUImage input movieURL output filteredMovieURLGPUImage 输入movieURL 输出filteredMovieURL
【发布时间】:2016-09-09 10:41:39
【问题描述】:

我能够在 GPUImageView 上显示当前过滤的视频。 但我无法使用 GPUImageMovieWriter 保存它。 (或者我只是不知道如何..)

我的目标是输入 VideoURL 并获取过滤后的视频输出 URL。 然后我将播放过滤后的视频。

这是我目前拥有的

static func createFilterMovie(videoURL url: NSURL?, filteredView: GPUImageView, completion completionHandler: (movieURL: NSURL?) -> Void) {

    let gpuMovie = GPUImageMovie(URL: url)
    gpuMovie.playAtActualSpeed = true

    filteredView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill

    let filter = GPUImageGrayscaleFilter()

    gpuMovie.addTarget(filter)
    gpuMovie.playAtActualSpeed = true
    filter.addTarget(filteredView)

    // save
    let filteredFile = NSHomeDirectory().stringByAppendingString("Documents/Movie.m4v")
    unlink(NSString(string: filteredFile).UTF8String)
    let movieURL = NSURL.fileURLWithPath(filteredFile)

    gpuMovie.startProcessing()
    completionHandler(movieURL: movieURL)

}

【问题讨论】:

    标签: swift video gpuimage movie


    【解决方案1】:

    这是解决方案.. 代码如下..

    但首先请记住这一点,首先您只需要播放视频(已过滤)。然后,一旦你需要,你也可以保存它。因为您的应用中有多个过滤器。因此,每次保存它都会导致内存问题或加载问题。所以首先只对使用 GPUImage Filter 播放的视频应用过滤器,然后你可以保存它。我将两个代码都放在下面:

    // 1. 在 GPUMovieView 上播放视频的代码。

    self.playerItem = AVPlayerItem(URL:  NSURL(fileURLWithPath: filePath))
    self.player = AVPlayer(playerItem: self.playerItem)
    self.movieView = GPUImageView(frame: self.vview.frame)
    self.player.replaceCurrentItemWithPlayerItem(self.playerItem)
    self.movieFile = GPUImageMovie(playerItem: self.playerItem)
    self.movieFile.runBenchmark = true
    self.movieFile.playAtActualSpeed = true
    self.movieFile.addTarget(self.filter)
    self.filter.addTarget(self.movieView)
    self.movieFile.startProcessing()
    self.view.addSubview(self.movieView)
    //   self.view.sendSubviewToBack(self.movieView)
    self.movieRunning = true
    self.player.play()
    

    并保存该视频代码,如下所示:

    self.movieFile = GPUImageMovie(URL: NSURL(fileURLWithPath: filePath))
    self.movieFile.runBenchmark = true
    self.movieFile.playAtActualSpeed = false
    self.movieFile.addTarget(self.filter)
    let Data = NSData(contentsOfURL: NSURL(fileURLWithPath: filePath))
    
    let anAsset = AVAsset(URL: NSURL(fileURLWithPath: filePath))
    let vanasset = anAsset.tracksWithMediaType(AVMediaTypeVideo)[0]
    print(vanasset.naturalSize)
    let orientation : UIInterfaceOrientation = self.orientationForTrack(anAsset)
    print(orientation)
    if orientation == .Portrait 
    {
    filter.setInputRotation(.RotateRight, atIndex: 0)
    
    }
    else if orientation == .LandscapeRight {
    filter.setInputRotation(.Rotate180, atIndex: 0)
    }
    else if orientation == .PortraitUpsideDown {
    filter.setInputRotation(.RotateLeft, atIndex: 0)
    }
    let videoAssetTrack = anAsset.tracksWithMediaType(AVMediaTypeVideo)[0]
    var naturalSize = CGSize()
    
    naturalSize = vanasset.naturalSize
    
    
     self.movieWriter = GPUImageMovieWriter(movieURL: NSURL(fileURLWithPath:pathToMovie), size: p)
    
     let input : GPUImageOutput!
    input = self.filter
    input.addTarget(self.movieWriter)
            self.movieWriter.shouldPassthroughAudio = true
            if anAsset.tracksWithMediaType(AVMediaTypeAudio).count > 0 {
                self.movieFile.audioEncodingTarget =  self.movieWriter
            }
            else
            {
                self.movieFile.audioEncodingTarget = nil
            }
    self.movieFile.enableSynchronizedEncodingUsingMovieWriter(self.movieWriter)
            self.movieWriter.startRecording()
            self.movieFile.startProcessing()
            self.movieWriter.completionBlock =
    
                {() -> Void in
    
    
                    self.movieWriter.finishRecording()
                    self.movieFile.cancelProcessing()
                    input.removeAllTargets()
                    self.movieFile.removeAllTargets()
    }
    

    试试上面的代码,如果你需要任何帮助,请随时问我。

    【讨论】:

    • 如果有不同的过滤器,则制作一个 GPUImage 过滤器数组。
    【解决方案2】:

    我已使用以下代码保存视频,希望对您有所帮助

    声明 GPUImageMovie 和 GPUImageMovieWriter 如下:

    private var gpuMovie: GPUImageMovie = GPUImageMovie()
    private var movieWriter: GPUImageMovieWriter!
    

    使用以下代码保存视频:

                gpuMovie.removeAllTargets()
                gpuMovie = GPUImageMovie(url: videoURL)
    
                let filter = GPUImageThresholdSketchFilter()
                gpuMovie.addTarget(filter)
                gpuMovie.playAtActualSpeed = true
                filter.addTarget(filterView)
    
                gpuMovie.runBenchmark = true
    
                let documentsPath: String = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true)[0] as String
                let exportPath: String = documentsPath.appendingFormat("/ExportedVideo.mov")
                let exportUrl: URL = NSURL.fileURL(withPath: exportPath as String)
    
                let asset = AVURLAsset(url: videoURL!, options: nil)
                let videoAssetTrack: AVAssetTrack = asset.tracks(withMediaType: .video)[0]
    
                unlink(exportUrl.path)
    
                print(exportUrl)
    
                let videoSettings: NSDictionary = [AVVideoCodecKey: AVVideoCodecH264 , AVVideoWidthKey: 720 , AVVideoHeightKey: 1080, AVVideoCompressionPropertiesKey: [AVVideoAverageBitRateKey: 6000000, AVVideoProfileLevelKey: AVVideoProfileLevelH264High40]]
    
                movieWriter = GPUImageMovieWriter.init(movieURL: exportUrl, size: CGSize(width: videoAssetTrack.naturalSize.width, height: videoAssetTrack.naturalSize.height), fileType: AVFileType.mp4.rawValue, outputSettings: videoSettings as! [AnyHashable : Any])
    
                filter.addTarget(movieWriter)
    
                movieWriter.shouldPassthroughAudio = true
    
                movieWriter.startRecording()
                gpuMovie.startProcessing()
    

    注意: videoURL 是您视频的导入 URL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多