我正在 iPhone 4 上使用前置摄像头拍摄视频,并将视频与其他一些媒体资源结合起来。我希望该视频为纵向 - 所有视频的默认方向都是横向,在某些情况下,您必须手动管理。
我正在使用 AVFoundation,特别是 AVAssetExportSession 和 AVMutableVideoComposition。根据 WWDC 视频,很明显,当我将视频组合成新的作品时,我必须自己“修复”方向。
因此,我创建了一个附加到 AVMutableVideoCompositionInstruction 的 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))
注意:您的翻译值可能会有所不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)