2016-05-05 4 views
0

CGRectとすると、ビデオをトリミングするにはGPUImageを使用します。たとえば、矩形が(0, 0, 50, 50)の場合、ビデオは(0,0)で切り取られ、各辺の長さは50になります。私を投げ何GPUImageからCGRectにクロップして回転する

GPUImageCropFilterが矩形を取ることはありません、0から1へマイ直感の範囲の値ではなく、正規化されたトリミング領域がこれまでにあったことである。

let assetSize = CGSizeApplyAffineTransform(videoTrack.naturalSize, videoTrack.preferredTransform) 
let cropRect = CGRect(x: frame.minX/assetSize.width, 
       y: frame.minY/assetSize.height, 
       width: frame.width/assetSize.width, 
       height: frame.height/assetSize.height) 

ベースのトリミング領域を計算します着信資産のサイズ次に:

// Filter 
let cropFilter = GPUImageCropFilter(cropRegion: cropRect) 
let url = NSURL(fileURLWithPath: "\(NSTemporaryDirectory())\(String.random()).mp4") 
let movieWriter = GPUImageMovieWriter(movieURL: url, size: assetSize) 
movieWriter.encodingLiveVideo = false 
movieWriter.shouldPassthroughAudio = false 

// add targets 
movieFile.addTarget(cropFilter) 
cropFilter.addTarget(movieWriter) 

cropFilter.forceProcessingAtSize(frame.size) 
cropFilter.setInputRotation(kGPUImageRotateRight, atIndex: 0) 

映画のサイズはどうすればよいですか?私は切り抜きたいフレームのサイズではないでしょうか?私のクロップフレームのサイズの値にforceProcessingAtSizeを使用する必要がありますか?

完全なコード例は素晴らしいでしょう。私は何時間も試してきましたが、私が望むビデオのセクションを手に入れることはできません。 FINAL

:あなたが注意したよう

if let videoTrack = self.asset.tracks.first { 
      let movieFile = GPUImageMovie(asset: self.asset) 
      let transformedRegion = CGRectApplyAffineTransform(region, videoTrack.preferredTransform) 

      // Filters 
      let cropFilter = GPUImageCropFilter(cropRegion: transformedRegion) 

      let url = NSURL(fileURLWithPath: "\(NSTemporaryDirectory())\(String.random()).mp4") 
      let renderSize = CGSizeApplyAffineTransform(videoTrack.naturalSize, CGAffineTransformMakeScale(transformedRegion.width, transformedRegion.height)) 

      let movieWriter = GPUImageMovieWriter(movieURL: url, size: renderSize) 
      movieWriter.transform = videoTrack.preferredTransform 

      movieWriter.encodingLiveVideo = false 
      movieWriter.shouldPassthroughAudio = false 

      // add targets 
      // http://stackoverflow.com/questions/37041231/gpuimage-crop-to-cgrect-and-rotate 
      movieFile.addTarget(cropFilter) 
      cropFilter.addTarget(movieWriter) 

      movieWriter.completionBlock = { 
       observer.sendNext(url) 
       observer.sendCompleted() 
      } 

      movieWriter.failureBlock = { _ in 
       observer.sendFailed(.VideoCropFailed) 
      } 

      disposable.addDisposable { 
       cropFilter.removeTarget(movieWriter) 
       movieWriter.finishRecording() 
      } 

      movieWriter.startRecording() 
      movieFile.startProcessing() 
     } 

答えて

3

、GPUImageCropFilterは、正規化座標で長方形になります。 Xコンポーネント(origin.xとsize.width)をイメージの幅とYコンポーネントを高さで割って、CGRectをピクセル単位で正規化された座標に変換するだけでよいのです。

forceProcessingAtSize()を使用する必要はありません。クロップされたサイズの画像が自動的に出力されるためです。ムービーライターのサイズは、元のCGRectから知っているはずの、この切り抜かれたサイズと一致させる必要があります。

あなたが紹介する1つの複雑さは、回転です。クロップに加えてローテーションを適用する必要がある場合は、クロップ領域のXとYを交換する必要がないことを確認して確認することができます。これは、2つをスワップする必要がある場合は、出力で明らかになります。

しばらく前に回転を適用するといくつかのバグがありましたが、すべてを修正したかどうかはわかりません。もしそうでなければ、トリミングの前または後にダミーフィルター(ガンマまたは輝度をデフォルト値に設定)を挿入し、その段階で回転を適用することができます。

+0

私はあなたが正しいと思います。なぜなら、私が作った領域に 'videoTrack.preferredTransform'を適用して、トリミングして出力すると、出力されたビデオは回転しますが、回転フィルターを使って回転させると回転はうまくいきますが、ビデオの横に黒いバーが表示され、そこには表示されません。 – barndog

+0

私は最終的に働いているコードを投稿しました。回転フィルターを使用する必要はありませんでした。私は、ムービーライターのトランスフォームをビデオトラックのトランスフォームに設定しました。 何かについて知っているかもしれないが、2つのことがあります。ムービーを書き出してxcodeでドキュメントフォルダを開くと、次の2つのことが起こります。1)切り取ったすべてのムービーには、黒いバーが表示されます。 2)ムービーを再生するためにクリックすると、クイックタイムでファイルが変換され、変換によってサイドバーが取り除かれます。それが何であるか、どんな考えですか? – barndog

関連する問題