gpt4 book ai didi

iphone - CVPixelBufferLockBaseAddress 为什么?使用 AVFoundation 捕获静态图像

转载 作者:行者123 更新时间:2023-12-03 18:39:49 26 4
gpt4 key购买 nike


我正在编写一个 iPhone 应用程序,它使用 AVFoundation 从相机创建静态图像。阅读编程指南,我发现了一段几乎满足我需要的代码,因此我尝试“逆向工程”并理解它。
我发现理解将 CMSampleBuffer 转换为图像的部分有些困难。
这是我的理解以及后来的代码。
CMSampleBuffer 表示内存中的一个缓冲区,其中存储带有附加数据的图像。后来我调用函数 CMSampleBufferGetImageBuffer() 来接收仅包含图像数据的 CVImageBuffer。
现在有一个函数我看不懂,只能想象它的功能:CVPixelBufferLockBaseAddress(imageBuffer, 0);我不明白它是否是一个“线程锁”以避免对其进行多次操作,或者是对缓冲区地址的锁定以避免操作期间发生更改(为什么它应该改变?..另一个帧,数据不是被复制的吗?在另一个地方?)。其余的代码对我来说很清楚。
尝试在谷歌上搜索,但仍然没有找到任何有用的信息。
有人可以带来一些光吗?

-(UIImage*) getUIImageFromBuffer:(CMSampleBufferRef) sampleBuffer{

// Get a CMSampleBuffer's Core Video image buffer for the media data
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

// Lock the base address of the pixel buffer
CVPixelBufferLockBaseAddress(imageBuffer, 0);

void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);

// Get the number of bytes per row for the pixel buffer
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
// Get the pixel buffer width and height
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);

// Create a device-dependent RGB color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

// Create a bitmap graphics context with the sample buffer data
CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,
bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
// Create a Quartz image from the pixel data in the bitmap graphics context
CGImageRef quartzImage = CGBitmapContextCreateImage(context);
// Unlock the pixel buffer
CVPixelBufferUnlockBaseAddress(imageBuffer,0);

// Free up the context and color space
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);

// Create an image object from the Quartz image
UIImage *image = [UIImage imageWithCGImage:quartzImage];

// Release the Quartz image
CGImageRelease(quartzImage);

return (image);
}

谢谢,安德里亚

最佳答案

头文件说 CVPixelBufferLockBaseAddress 使内存“可访问”。我不确定这到底意味着什么,但如果你不这样做,CVPixelBufferGetBaseAddress 就会失败,所以你最好这样做。

编辑

简单的回答就是去做。为什么要考虑该图像可能不存在于主内存中,它可能存在于某些 GPU 上某处的纹理中(CoreVideo 也可以在 mac 上工作),甚至与您期望的格式不同,因此您获得的像素实际上是复制。如果没有锁定/解锁或某种开始/结束对,实现就无法知道您何时完成重复像素,因此它们实际上会被泄漏。 CVPixelBufferLockBaseAddress 只是提供 CoreVideo 范围信息,我不会太在意它。

是的,他们可以简单地从 CVPixelBufferGetBaseAddress 返回像素并完全消除 CVPixelBufferLockBaseAddress。我不知道他们为什么不这样做。

关于iphone - CVPixelBufferLockBaseAddress 为什么?使用 AVFoundation 捕获静态图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6468535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com