CMSampleBufferRef 的缓冲区大小

use*_*083 5 video avfoundation ios

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

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
Run Code Online (Sandbox Code Playgroud)

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

size_t CMSampleBufferGetTotalSampleSize ( CMSampleBufferRef sbuf );
Run Code Online (Sandbox Code Playgroud)

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

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

CVPixelBufferRef PixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

从pixelBuffer获取sampleBuffer的大小?

Sye*_*man 5

如果您CMSampleBuffer希望包含图像,那么您可以执行如下操作

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


wao*_*813 0

如何创建 AVCaptureSession?

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

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

因此,您应该首先检查是否captureoutput是您想要的,如果是并且您期望图像,那么您应该获取图像,CVPixelBufferRef然后使用检查图像上的数据大小CVPixelBufferGetDataSize