CVImageBufferRef的CVPixelBufferGetBytesPerRow()为1080p视频帧返回意外的错误值

时间:2013-10-25 10:20:55

标签: ios media video-capture avcapturesession

我正在开发一个应用程序,使用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)
.....
}

1 个答案:

答案 0 :(得分:0)

Apple发布"技术Q& A QA1829了解CVPixelBufferGetBytesPerRow"返回的每行字节数值。在2014年5月1日,这表明这是由于硬件对齐要求。有关详细信息,请参阅技术说明。