Я разрабатываю приложение, выполняющее обработку видео в реальном времени с использованием 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)
.....
}
В настоящее время я испытываю ту же проблему с изображениями PNG. 'CVPixelBufferGetBytesPerRow' возвращает результат, полностью не связанный с размером/глубиной изображения. – BartoszKP
Нашли ответ здесь: http://stackoverflow.com/questions/6540710/ios-cvimagebuffer-distorted-from-avcapturesessiondataoutput-with-avcapturesessio – BartoszKP
Эй, я столкнулся с той же проблемой. Вы получаете какое-либо решение? Спасибо – Punita