AVAssetsがAVAssetWriter
またはAVComposition
のいずれかを使用してファイルに書き込んだ後に、AVAssetsがローテーションするようになっていることはよくわかっています。また、ビデオトラックの変換を見て、資産がどのように回転しているかを見て、特定のユースケースに合わせて目的の方向に回転できるようにするなどのソリューションもあります。AVAssetローテーション
しかし、私が知りたいのは、なぜこのようなことが起こり、起こるのを防ぐことができるのかということです。カスタムビデオファイルを作成するだけでなく、CGImageDestination
を使用してビデオをgifに変換することで、出力GIFが回転している以外はすばらしく見える問題が発生します。あなたが上見ることができるように変換する簡単なポートレートに戻って出力される映像を回転させ、
let destinationURL = url ?? NSURL(fileURLWithPath: "\(NSTemporaryDirectory())\(String.random()).mp4")
if let writer = try? AVAssetWriter(URL: destinationURL, fileType: AVFileTypeMPEG4),
videoTrack = self.asset.tracksWithMediaType(AVMediaTypeVideo).last,
firstBuffer = buffers.first {
let videoCompressionProps = [AVVideoAverageBitRateKey: videoTrack.estimatedDataRate]
let outputSettings: [String: AnyObject] = [
AVVideoCodecKey: AVVideoCodecH264,
AVVideoWidthKey: width,
AVVideoHeightKey: height,
AVVideoCompressionPropertiesKey: videoCompressionProps
]
let writerInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: outputSettings, sourceFormatHint: (videoTrack.formatDescriptions.last as! CMFormatDescription))
writerInput.expectsMediaDataInRealTime = false
let rotateTransform = CGAffineTransformMakeRotation(Utils.degreesToRadians(-90))
writerInput.transform = CGAffineTransformScale(rotateTransform, -1, 1)
let pixelBufferAdaptor = AVAssetWriterInputPixelBufferAdaptor(assetWriterInput: writerInput, sourcePixelBufferAttributes: nil)
writer.addInput(writerInput)
writer.startWriting()
writer.startSessionAtSourceTime(CMSampleBufferGetPresentationTimeStamp(firstBuffer))
for (sample, newTimestamp) in Array(Zip2Sequence(buffers, timestamps)) {
if let imageBuffer = CMSampleBufferGetImageBuffer(sample) {
while !writerInput.readyForMoreMediaData {
NSThread.sleepForTimeInterval(0.1)
}
pixelBufferAdaptor.appendPixelBuffer(imageBuffer, withPresentationTime: newTimestamp)
}
}
writer.finishWritingWithCompletionHandler {
// completion code
}
:
は、資産をファイルに書き込み、私のコードのためのクイックリファレンスポイントを与えるために。しかし、私が風景ビデオを持っていれば、その変換はもはや機能しません。前にも触れましたが、動画をgif形式に変換すると、アセットでは全く同じ90度の回転が行われます。私の気持ちは、これら2つのGIFファイルにまとめることができます。
http://giphy.com/gifs/jon-stewart-why-lYKvaJ8EQTzCU
http://giphy.com/gifs/the-office-no-steve-carell-12XMGIWtrHBl5e
それがなぜ起こるか、私が求めていた、それを修正しませんか。 – barndog