【问题标题】:CVPixelBufferGetBytesPerRow() for CVImageBufferRef returns unexpected wrong value for 1080p video frameCVImageBufferRef 的 CVPixelBufferGetBytesPerRow() 返回 1080p 视频帧的意外错误值
【发布时间】:2013-11-04 09:57:31
【问题描述】:

我正在开发一个使用 AVFoundation 和 iDevices 后置摄像头进行实时视频处理的应用程序。 AVCaptureSession 配置了 sessionPreset AVCaputeSessionPreset1920x1080(全高清),视频设置 kCVPixelBufferPixelFormatTypeKey=kCVPixelFormatType_32BGRA 并将 CMSampleBufferRef 类型的样本缓冲区输出到 AVCaptureVideoDataOutput 委托。使用视频/界面方向纵向(意味着预期大小为 1080x1920 的帧)。每次到达一帧时,都会从样本缓冲区中检索一个 CVImageBufferRef 以进一步访问它的原始字节。在访问此 CVImageBufferRef 实例的 CVPixelBufferGetBytesPerRow() 时,我得到的值是 4352,这在我看来是完全出乎意料的。我的期望是,对于整个帧宽度(1080),每行的字节数反映了每个像素 4 个字节(BGRA),从而导致值 4320(=1080*4 字节)。每行字节数 = 4352,除以 4 字节,得到的帧宽为 1088。有谁知道为什么会发生这种情况?在按像素分析时,我无法使用 1080 的预期宽度,因为它会导致图像失真(检查转换为 UIImage 并保存到磁盘),我绝对需要使用 1088 作为宽度,因此图像是直的并且分析给出正确的结果 - 但这很奇怪。

由于我使用原始帧字节进行实时分析并希望使用 1080 的宽度,这对我来说非常重要,因此我非常感谢在这个问题上的帮助。

使用的设备: - 带有 iOS 6.0.1 的 iPod touch 5G - 装有 iOS 7.0.2 的 iPhone 5S

代码摘录:

- (uint8_t*) convertSampleBuffer: (CMSampleBufferRef) sampleBuffer {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); // = 4352 (=1088*4)
.....
}

【问题讨论】:

  • 我目前在使用 PNG 图像时遇到了同样的问题。 CVPixelBufferGetBytesPerRow 返回与图像大小/深度完全无关的结果。
  • 在这里找到答案:stackoverflow.com/questions/6540710/…
  • 嘿,我也面临同样的问题。你有什么解决办法吗?谢谢

标签: ios media video-capture avcapturesession


【解决方案1】:

Apple 于 2014 年 5 月 1 日发布了“技术问答 QA1829 了解 CVPixelBufferGetBytesPerRow 返回的每行字节值”,其中指出这是由于硬件对齐要求。有关详细信息,请参阅技术说明。

【讨论】:

  • 谢谢,是的,我已经阅读了该说明,您知道如何更正 BytesPerRaw 吗? - 谢谢
猜你喜欢
  • 2015-08-23
  • 2013-08-16
  • 2018-12-28
  • 1970-01-01
  • 2021-07-29
  • 2019-09-10
  • 2016-08-10
  • 2022-11-21
  • 2015-05-09
相关资源
最近更新 更多