Когда я кадр из - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
я получаю обратно следующие данные:Каковы эти дополнительные байты, поступающие с камеры iPhone в портретном режиме?
- BytesPerRow: 1472 Длина: 706560 Высота: 480 Ширина: 360 Формат: BGRA
Это с фронта камера на iPhone 6 плюс. Это не имеет смысла, поскольку байты в строке должны быть (ширина * каналов) (каналы в этом случае равны 4). Тем не менее, это (ширина + 8) * каналов. Где эти дополнительные 8 байтов?
Вот мой код: Прикрепления выхода на сессию я установить ориентацию портрет
bool attachOutputToSession(AVCaptureSession *session, id cameraDelegate)
{
assert(cameraDelegate);
AVCaptureVideoDataOutput *m_videoOutput = [[AVCaptureVideoDataOutput alloc] init];
//create a queue for capturing frames
dispatch_queue_t captureQueue = dispatch_queue_create("captureQueue", DISPATCH_QUEUE_SERIAL);
//Use the AVCaptureVideoDataOutputSampleBufferDelegate capabilities of CameraDelegate:
[m_videoOutput setSampleBufferDelegate:cameraDelegate queue:captureQueue];
//setup the video outputs
m_videoOutput.alwaysDiscardsLateVideoFrames = YES;
NSNumber *framePixelFormat = [NSNumber numberWithInt:kCVPixelFormatType_32BGRA];//This crashes with 24RGB b/c that isn't supported on iPhone
m_videoOutput.videoSettings = [ NSDictionary dictionaryWithObject:framePixelFormat forKey:(id)kCVPixelBufferPixelFormatTypeKey];
//Check if it already has an output from a previous session
if ([session canAddOutput:m_videoOutput])
{
[session addOutput:m_videoOutput];
}
//set connection settings
for (AVCaptureConnection *connection in m_videoOutput.connections)
{
if (connection.isVideoMirroringSupported)
connection.videoMirrored = true;
if (connection.isVideoOrientationSupported)
connection.videoOrientation = AVCaptureVideoOrientationPortrait;
}
return true;
}
Когда я установить ориентацию LandscapeRight у меня нет этой проблемы. Байты на строку равны ширине * каналов.
Вот где я получаю число упомянутое выше:
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CIImage *ciImage = [CIImage imageWithCVPixelBuffer:imageBuffer];
CVPixelBufferLockBaseAddress(imageBuffer,0);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
}
32BRGA - это единый плоский формат, поэтому нет причин связываться с CVPixelBufferGetBytesPerRowOfPlane. Просто используйте CVPixelBufferGetBytesPerRow, чтобы получить шаг. – user1055568
Вы правы, это работает отлично. Тем не менее, я имел дело с структурой изображения, которая занимала только байты, ширину, высоту и общий размер. Поэтому для меня было важно выяснить, как рассчитать это только с данными, которые я получил позже. – spfursich