2016-09-09 10 views
0

現在のフィルタリングされたビデオをGPUImageViewに表示できます。 GPUImageMovieWriterを使用して保存することはできません。 (または私はちょっと...)GPUImage入力movieURL出力filteredMovieURL

私の目標は、VideoURLをフィードし、filteredVideoの出力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) 

} 

答えて

2

ここで解決策があるしているものを以下のようなコード..です

しかし、まず(フィルタリングあなたが唯一のビデオを再生する必要がある最初の心のHTTAにものを保管してください)。その後、必要になったらそれも保存することができます。あなたのアプリに複数のフィルタがあるためです。だから毎回、それを保存する場合は、メモリの問題や読み込みの問題が発生します。だから最初に再生しているビデオにのみフィルタを適用するGPUImageのフィルタを使用して、それを保存することができます。両方のコードを以下に入れています:

// 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() 
} 

コード上で試してみて、何か助けが必要な場合は私にお気軽に。

+0

異なるフィルタがある場合、GPUImageフィルタの配列を作成します。 – JAck