如何创建和重用 CVPixelBufferRef 数组?
How to create and reuse an array of CVPixelBufferRef?
在我的应用程序中,我需要
- 创建 24 CVPixelBufferRef
- 稍后将它们添加到 AVAssetWriterInputPixelBufferAdaptor 中以自定义顺序编写 mp4 电影。
VideoExport::addFrame 函数接收原始像素数据并将其存储在下一个空的 CVPixelBufferRef 中。这是演示代码:
// .h
CVPixelBufferRef buffers[24];
// .mm
void VideoExport::addFrame(unsigned char * pixels, long frame_index) {
buffers[frame_index] = NULL;
CVPixelBufferCreateWithBytes(NULL,
frameSize.width,
frameSize.height,
kCVPixelFormatType_24RGB,
(void*)pixels,
frameSize.width * 3,
NULL,
0,
NULL,
&buffers[frame_index]);
}
像素缓冲区似乎已成功填充。问题是,当我尝试通过更改 buffers[index]
中的 index
将不同的帧写入电影文件时,相同的帧被保存了一遍。
保存的帧似乎总是我发送到 addFrame
的最后一帧,这使我使用一组唯一缓冲区的尝试失败了。我怀疑对 addFrame
的任何调用都会覆盖以前的数据。
注1:我测试过发送到addFrame
的像素是唯一的。
注意 2:如果我在 addFrame
内立即将帧添加到电影中,则制作的电影具有独特的帧,但我无法打乱帧顺序。
创建和重用 CVPixelBufferRef 数组的正确方法是什么? pixelBufferPool
会有帮助吗?如果有,我该如何使用它?
谢谢。
好的,找到问题了。
在我的 addFrame
函数中,unsigned char * pixels
在每次调用 addFrame 后被销毁。但是为了使 buffers
数组以后可用,像素需要保持活动状态,直到 buffers
数组被销毁。
在我的应用程序中,我需要
- 创建 24 CVPixelBufferRef
- 稍后将它们添加到 AVAssetWriterInputPixelBufferAdaptor 中以自定义顺序编写 mp4 电影。
VideoExport::addFrame 函数接收原始像素数据并将其存储在下一个空的 CVPixelBufferRef 中。这是演示代码:
// .h
CVPixelBufferRef buffers[24];
// .mm
void VideoExport::addFrame(unsigned char * pixels, long frame_index) {
buffers[frame_index] = NULL;
CVPixelBufferCreateWithBytes(NULL,
frameSize.width,
frameSize.height,
kCVPixelFormatType_24RGB,
(void*)pixels,
frameSize.width * 3,
NULL,
0,
NULL,
&buffers[frame_index]);
}
像素缓冲区似乎已成功填充。问题是,当我尝试通过更改 buffers[index]
中的 index
将不同的帧写入电影文件时,相同的帧被保存了一遍。
保存的帧似乎总是我发送到 addFrame
的最后一帧,这使我使用一组唯一缓冲区的尝试失败了。我怀疑对 addFrame
的任何调用都会覆盖以前的数据。
注1:我测试过发送到addFrame
的像素是唯一的。
注意 2:如果我在 addFrame
内立即将帧添加到电影中,则制作的电影具有独特的帧,但我无法打乱帧顺序。
创建和重用 CVPixelBufferRef 数组的正确方法是什么? pixelBufferPool
会有帮助吗?如果有,我该如何使用它?
谢谢。
好的,找到问题了。
在我的 addFrame
函数中,unsigned char * pixels
在每次调用 addFrame 后被销毁。但是为了使 buffers
数组以后可用,像素需要保持活动状态,直到 buffers
数组被销毁。