我正在使用带有前置摄像头的 iPhone 4 拍摄视频,并将视频与其他一些媒体 Assets 相结合。我希望此视频为纵向 - 所有视频的默认方向均为横向,在某些情况下,您必须手动进行管理。
我正在使用 AVFoundation,特别是 AVAssetExportSession 和 AVMutableVideoComposition。根据 WWDC 视频,很明显,当我将视频组合成新作品时,我必须自己“修复”方向。
所以,我创建了一个附加到我的 AVMutableVideoCompositionLayerInstruction 的 AVMutableVideoCompositionLayerInstruction,我正在使用 setTransform:atTime: 方法来设置旨在旋转视频的转换:
AVMutableVideoCompositionLayerInstruction *passThroughLayer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
CGAffineTransform portraitRotationTransform = CGAffineTransformMakeRotation(degreesToRadians(90.0));
[passThroughLayer setTransform:portraitRotationTransform atTime:kCMTimeZero];
问题是当我查看导出的视频时,屏幕上没有任何实际内容。如果我将旋转角度减小到大约 45 度,我可以在屏幕上看到部分视频 - 就好像它没有在中心点旋转一样。我在下面添加了图片,以便更清楚地说明我在说什么。
视频的自然尺寸恢复为 480x360。我已尝试将其更改为 360x480,但这不会影响核心问题。
0 度旋转:
45 度旋转:
90 度旋转只是全绿色。
无论如何,我希望以前做过这件事的人能给我指明正确的方向。我找不到关于 AVFoundation 组合和导出中一些更高级主题的任何文档。
最佳答案
以目前已回答的内容为基础。我找到了一种非常好的调试方法,可以找出您的转换出了什么问题。使用可用的渐变方法,您可以为变换设置动画,从而更容易查看变换正在做什么。
大多数时候,我发现自己的转换似乎无能为力,直到我意识到仅使用视频轨道的 preferredTransform 属性可能会导致视频源移出渲染屏幕。
AVMutableVideoCompositionLayerInstruction *videoLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
[videoLayerInstruction setTransformRampFromStartTransform:CGAffineTransformIdentity
toEndTransform:videoTrack.preferredTransform
timeRange:CMTimeRangeMake(projectClipStart, projectClipDuration)];
最终,我发现在某些情况下我需要应用转换才能将旋转后的视频带回渲染屏幕。
CGAffineTransformConcat(videoTrack.preferredTransform, CGAffineTransformMakeTranslation(0, renderSize.height))
注意:您的翻译值可能不同。
关于iphone - 使用 AVMutableVideoCompositionLayerInstruction 旋转视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5187789/