CMSampleBufferRef的缓冲区大小

时间:2015-04-01 08:13:36

标签: ios video avfoundation

我想从AVFoundation回调中获取CMSampleBufferRef的大小

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection

根据文件https://developer.apple.com/library/mac/documentation/CoreMedia/Reference/CMSampleBuffer/index.html#//apple_ref/c/func/CMSampleBufferGetSampleSize

size_t CMSampleBufferGetTotalSampleSize ( CMSampleBufferRef sbuf );

如果我理解正确,我应该使用此方法来获取缓冲区大小。但 我总是从归来得到0。据说“如果此CMSampleBuffer中没有样本大小,则返回大小为0”。在这种情况下,我想知道AVFoundation框架是不提供缓冲区大小信息还是我误解了文档。

跟进问题: 顺便说一句,我想知道在这种情况下我是否可以使用

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

从pixelBuffer获取sampleBuffer的大小?

2 个答案:

答案 0 :(得分:1)

如果您的 CMSampleBuffer 预期包含图像,那么您可以执行以下操作

- (CGSize)sampleBufferSize:(CMSampleBufferRef)sampleBuffer {
          CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
          size_t imageWidth = CVPixelBufferGetWidth(imageBuffer);
          size_t imageHeight = CVPixelBufferGetHeight(imageBuffer);
          return CGSizeMake(imageWidth, imageHeight);
}

答案 1 :(得分:0)

如何创建AVCaptureSession?

CMSampleBuffer基本上可以包含多个信息。

  • 原始图像缓冲区(可以使用CMSampleBufferGetImageBuffer提取)
  • 音频缓冲区(您必须使用CMSampleBufferGetBlockBuffer提取)
  • CoreVideo编码图像数据缓冲区(也必须使用CMSampleBufferGetBlockBuffer提取)

因此,您应首先检查captureoutput是否符合您的要求,如果是,并且您希望获得图像,则应将图像设为CVPixelBufferRef,然后检查图像上的数据大小使用CVPixelBufferGetDataSize