2015-02-12 76 views
0

當我從- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection一個框架,我找回了以下數據:縱向模式下這些額外的字節來自iPhone相機是什麼?

  • BytesPerRow:1,472長度: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。

根據該頁面http://gstreamer-devel.966125.n4.nabble.com/iOS-capture-problem-td4656685.html

上rpappalax跨距是有效CVPixelBufferGetBytesPerRowOfPlane()和 包括填充(如果有的話)。當沒有填充時 CVPixelBufferGetBytesPerRowOfPlane()將等於 CVPixelBufferGetWidth(),否則它會更大。

雖然這不完全是我的經驗。

+0

32BRGA是一個單一的平面格式,所以沒有理由搞亂CVPixelBufferGetBytesPerRowOfPlane。只需使用CVPixelBufferGetBytesPerRow即可獲得步伐。 – user1055568 2015-02-12 18:50:27

+0

你是對的,這工作得很好。但是,我正在處理只佔用字節,寬度,高度和總大小的圖像結構。所以對我來說很重要的一點是如何計算這個數據,而不是我以後的數據。 – spfursich 2015-02-13 22:03:17

相關問題