2015-02-12 1 views
0

Когда я кадр из - (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); 
} 

ответ

1

OK оказывается, что это часть образа «походка». Если ширина изображения не делится на выделенную выделенную память, тогда добавляется дополнительное дополнение. Когда я получаю портретное изображение, это 360x480. Так как 360 не делится на 16, в качестве дополнения добавляются 8 дополнительных байтов. 16 - это пространство памяти в этом случае. У меня не было этой проблемы раньше, потому что 480 делится на 16. Вы можете получить этот номер, позвонив по телефону CVPixelBufferGetBytesPerRowOfPlane (imageBuffer, 1); Что странно, так это то, что он возвращает 0 первый раз, 1 второй раз и так далее, пока он не достигнет реальный уровень буфера (8). Затем он снова возвращает 0 на девятом изображении.

В соответствии с rpappalax на этой странице http://gstreamer-devel.966125.n4.nabble.com/iOS-capture-problem-td4656685.html

походку эффективно CVPixelBufferGetBytesPerRowOfPlane() и включает в себя прокладку (если таковые имеются). Если нет прокладки CVPixelBufferGetBytesPerRowOfPlane() будет равен CVPixelBufferGetWidth(), в противном случае он будет больше.

Хотя это был не совсем мой опыт.

+0

32BRGA - это единый плоский формат, поэтому нет причин связываться с CVPixelBufferGetBytesPerRowOfPlane. Просто используйте CVPixelBufferGetBytesPerRow, чтобы получить шаг. – user1055568

+0

Вы правы, это работает отлично. Тем не менее, я имел дело с структурой изображения, которая занимала только байты, ширину, высоту и общий размер. Поэтому для меня было важно выяснить, как рассчитать это только с данными, которые я получил позже. – spfursich