CMSampleBuffer 的翻转/镜像方向

Flipped / mirrored orientation of CMSampleBuffer

我有一个当前非常简单的相机预览应用程序,AVCaptureVideoDataOutputSampleBufferDelegate 也消耗视频帧。我对这些帧进行了一些处理(现在没什么困难,我只是平均 r、g、b 值进行灰度化)并将它们绘制到 UIView 上。

第一次这样做时,我注意到视图被翻转了。啊,我想,当然AVCaptureConnection的默认方向是LandscapeLeft,所以我把它改成了Portrait。现在缓冲区是纵向的。上下翻转。并镜像。

我可以通过将 AVCaptureConnectionvideoOrientation 设置为 PortraitUpsideDown 并将 isVideoMirrored 设置为 true 来按照我想要的方式获得它,但是我不知道为什么我需要这样做并且找不到相关文档或其他人做同样的事情。附加到我的 AVCaptureVideoPreviewLayerAVCaptureConnection 似乎没有做同样的事情。我不想只是为了看到它在其他设备上中断而进行此更改,所以我想了解这里发生了什么。所以问题来了:为什么我的 CMSampleBuffers 倒置并镜像到 iOS 11.4 上的 iPhone 5s 后置摄像头?我真诚地希望有人能对这种情况有所了解。

几个小时后,我可以回答我自己的问题了。

CMSampleBuffer返回的CVImageBuffer有一个isFlipped属性,说明y轴已经翻转了。校正此翻转会生成正确的图像。

我纠正了! isFlipped 属性 实际上表示原点在我预期的位置,在左上角。在坐标系被翻转的错误假设下操作,我在处理中翻转了它。然后,我将结果渲染为 CGImage,我将其渲染为 UIView。因为 CGImage 实际上 确实 翻转了它的坐标系,所以一切看起来都很好,直到我尝试对图像数据和 those[=28 做其他事情=]出来翻转。原来问题一直是 CGImage