我正在使用AVComposition
编写一些视频处理代码。仅提供必要的背景细节,我从一个我无法控制的苹果API中接收到一个CVPixelBuffer
。这个CVPixel buffer包含了以前渲染过的视频帧,因为它们显然是由我无法控制的苹果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,它似乎设置起来很复杂。
memset_pattern16
,非常好用,谢谢!还有一件事要补充,对于那些想要将CIImage渲染到CVPixelBuffer中的人来说:在渲染之前进行清零操作,而不是在渲染完成并处理完pixelBuffer后再进行清零。我的AVAssetWriter与AVAssetWrinterInputPixelBufferAdaptor可能会以延迟的方式使用我的缓冲区,导致我的图像在视频中出现部分黑色。 - iSpain17