gpt4 book ai didi

ios - 使用 GPU 清除 CVPixelBufferRef

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:07:02 26 4
gpt4 key购买 nike

我正在使用 AVComposition 编写一些视频处理代码。仅提供必要的背景详细信息,我从我无法控制的苹果 API 收到一个 CVPixelBuffer。这个 CVPixel 缓冲区包含一个先前渲染的视频帧,因为它们显然被我不控制的这个 Apple API 回收了。所以我的目标是将 CVPixelBufferRef 中的所有像素设置为 [0, 0, 0, 0](在 RGBA 颜色空间中)。我可以通过此功能在 CPU 上执行此操作:

- (void)processPixelBuffer: (CVImageBufferRef)pixelBuffer
{
CVPixelBufferLockBaseAddress( pixelBuffer, 0 );

int bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
int bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);

for( int row = 0; row < bufferHeight; row++ ) {
for( int column = 0; column < bufferWidth; column++ ) {
pixel[0] = 0;
pixel[1] = 0;
pixel[2] = 0;
pixel[3] = 0;
pixel += 4;
}
}
CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );
}

有什么方法可以使用 GPU 完成同样的事情吗?此外,是否可以通过 CoreImage 执行此操作?因为我不知道 openGL,而且设置起来似乎很复杂。

最佳答案

您可以使用 Accelerate vImageBufferFill做到这一点(虽然不是 GPU)。这在 Swift 4 中用黑色填充 BGRA:

let width: Int = 3
let height: Int = 3

var pixelBuffer: CVPixelBuffer?
var imageBuffer: vImage_Buffer
var date: Date
let iterations: Int = 10000

let pixelBufferAttributes: [CFString: Any] = [kCVPixelBufferCGImageCompatibilityKey: true, kCVPixelBufferCGBitmapContextCompatibilityKey: true]
if CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_32BGRA, pixelBufferAttributes as CFDictionary, &pixelBuffer) != kCVReturnSuccess || pixelBuffer == nil { fatalError("Cannot create pixel buffer.") }
if CVPixelBufferLockBaseAddress(pixelBuffer!, []) != kCVReturnSuccess { fatalError("Cannot lock pixel buffer base address.") }
imageBuffer = vImage_Buffer(data: CVPixelBufferGetBaseAddress(pixelBuffer!), height: UInt(height), width: UInt(width), rowBytes: CVPixelBufferGetBytesPerRow(pixelBuffer!))
vImageBufferFill_ARGB8888(&imageBuffer, [0, 0, 0, 0xFF], UInt32(kvImageNoFlags))
if CVPixelBufferUnlockBaseAddress(pixelBuffer!, []) != kCVReturnSuccess { fatalError("Cannot unlock pixel buffer base address.") }

测试普通 memset 以在 10000 次迭代中用零填充小缓冲区在 playground 中要快得多。在具有真实数据的发布版本中,结果可能不会有太大差异。

  • 加速: 1629.0
  • 内存集: 314.0

enter image description here

关于ios - 使用 GPU 清除 CVPixelBufferRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26965905/

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