CMSampleBuffer的翻转/镜像方向



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

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

我可以通过将AVCaptureConnectionvideoOrientation设置为PortraitUpsideDown,将isVideoMirrored设置为true来获得它,但我不知道为什么我需要这样做,也找不到相关文档或其他人在做同样的事情。连接到我的AVCaptureVideoPreviewLayerAVCaptureConnection似乎没有做同样的事情。我不想仅仅为了看到它在其他设备上坏掉而做出这个改变,所以我想了解这里发生了什么。所以问题来了:为什么我的CMSampleBuffer被倒置并镜像到iOS 11.4上的iPhone 5s背面摄像头?我真诚地希望有人能对这种情况有所了解。

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

CMSampleBuffer返回的CVImageBuffer具有isFlipped属性,表示y轴已翻转。更正此翻转会生成正确的图像

我站着纠正!isFlipped属性实际上指示原点在我期望的位置,在左上角。在坐标系翻转的错误假设下操作,我在处理过程中翻转了它。然后,我将结果渲染到CGImage中,并在UIView中进行渲染。由于CGImage实际上确实的坐标系发生了翻转,所以一切看起来都很好,直到我尝试对图像数据进行其他处理,这些都发生了翻转。原来问题一直都出在CGImage上。

最新更新