2013-10-25 4 views
2

Я разрабатываю приложение, выполняющее обработку видео в реальном времени с использованием AVFoundation с камерами заднего вида iDevices. AVCaptureSession настроен с помощью sessionPreset AVCaputeSessionPreset1920x1080 (full HD), настроек видео kCVPixelBufferPixelFormatTypeKey = kCVPixelFormatType_32BGRA и выводит буферы выборки типа CMSampleBufferRef делегату AVCaptureVideoDataOutput. Используется портрет ориентации видео/интерфейса (предполагается, что ожидается размер кадров 1080x1920). При каждом приходе фрейма CVImageBufferRef извлекается из буфера выборки для дальнейшего доступа к его сырым байтам. При доступе к CVPixelBufferGetBytesPerRow() этого экземпляра CVImageBufferRef я получаю значение 4352, которое, на мой взгляд, совершенно неожиданно. Я ожидаю, что байт в строке отражает 4 байта (BGRA) на пиксель для всей ширины кадра (1080), что приводит к значению 4320 (= 1080 * 4 байта). С байтами в строке = 4352, разделенной на 4 байта, это даст ширину кадра 1088. Кто-нибудь знает, почему это происходит на самом деле? Я не могу работать с ожидаемой шириной 1080 при анализе по пикселям, поскольку это приводит к искаженным изображениям (проверено преобразование в UIImage и сохранение на диск), я определенно должен работать с 1088 как ширина, поэтому изображение прямое и анализы дают правильные результаты - но это странно.CVPixelBufferGetBytesPerRow() для CVImageBufferRef возвращает непредвиденное неправильное значение для видеофрагмента 1080p

Поскольку я использую байты необработанного кадра для анализа в реальном времени и рассчитываю использовать ширину 1080, это очень важно для меня, поэтому я очень ценю помощь по этой проблеме.

Устройства используются: - Ipod Touch 5G с прошивкой 6.0.1 - iPhone 5S с прошивкой 7.0.2

фрагмент кода:

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

В настоящее время я испытываю ту же проблему с изображениями PNG. 'CVPixelBufferGetBytesPerRow' возвращает результат, полностью не связанный с размером/глубиной изображения. – BartoszKP

+0

Нашли ответ здесь: http://stackoverflow.com/questions/6540710/ios-cvimagebuffer-distorted-from-avcapturesessiondataoutput-with-avcapturesessio – BartoszKP

+0

Эй, я столкнулся с той же проблемой. Вы получаете какое-либо решение? Спасибо – Punita

ответ

0

компании Apple выпустила «Технический Q & QA1829 Понимание байтов на значение строки, возвращаемое CVPixelBufferGetBytesPerRow "5/1/2014, в котором говорится, что это связано с требованиями к выравниванию оборудования. Подробную информацию см. В технической записке.

+0

Спасибо, да, я уже прочитал эту заметку, вы знаете, как исправить BytesPerRaw? - Благодаря – Punita

Смежные вопросы