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()
}
私はあなたが正しいと思います。なぜなら、私が作った領域に 'videoTrack.preferredTransform'を適用して、トリミングして出力すると、出力されたビデオは回転しますが、回転フィルターを使って回転させると回転はうまくいきますが、ビデオの横に黒いバーが表示され、そこには表示されません。 – barndog
私は最終的に働いているコードを投稿しました。回転フィルターを使用する必要はありませんでした。私は、ムービーライターのトランスフォームをビデオトラックのトランスフォームに設定しました。 何かについて知っているかもしれないが、2つのことがあります。ムービーを書き出してxcodeでドキュメントフォルダを開くと、次の2つのことが起こります。1)切り取ったすべてのムービーには、黒いバーが表示されます。 2)ムービーを再生するためにクリックすると、クイックタイムでファイルが変換され、変換によってサイドバーが取り除かれます。それが何であるか、どんな考えですか? – barndog