【发布时间】:2016-05-02 09:58:18
【问题描述】:
这是一个关于 SO 的有据可查的问题,其中 AVAsset 在使用 AVAssetWriter 或 AVComposition 将它们写入文件后会被轮换。还有一些解决方案,例如查看视频轨道变换并查看资产是如何旋转的,以便可以将其旋转到您的特定用例所需的方向。
但是,我想知道为什么会发生这种情况,以及是否有可能阻止它发生。我不仅遇到了编写自定义视频文件的问题,还遇到了使用 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 度旋转。
我的感受可以用这两张gif来概括:
http://giphy.com/gifs/jon-stewart-why-lYKvaJ8EQTzCU
http://giphy.com/gifs/the-office-no-steve-carell-12XMGIWtrHBl5e
【问题讨论】:
标签: ios swift avfoundation avasset