首页 > 解决方案 > CMSampleBuffer 的翻转/镜像方向

问题描述

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

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

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

标签: iosavfoundation

解决方案


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

CVImageBuffer返回的CMSampleBuffer有一个属isFlipped​​性,表示y轴已经翻转。校正此翻转会产生正确的图像。

我站纠正!该isFlipped属性实际上表明原点在我期望的位置,在左上角。在坐标系被翻转的错误假设下操作,我在处理中翻转了它。然后,我将结果CGImage渲染成UIView. 由于CGImage实际上确实有它的坐标系翻转,一切似乎都很好,直到我尝试对图像数据做其他事情并且那些翻转出来。原来问题一直是CGImage


推荐阅读