在我的应用程序中,我需要
- 创建 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]);
}
像素缓冲区似乎已成功填充。问题是当我尝试通过更改将不同的帧写入电影文件index
时buffers[index]
,相同的帧被保存,一遍又一遍。
被保存的帧似乎总是我发送到的最后一个帧addFrame
,挫败了我使用一组唯一缓冲区的尝试。我怀疑任何调用都会addFrame
覆盖以前的数据。
注1:我已经测试了发送到的像素addFrame
是唯一的。
注意 2:如果我立即将帧添加到电影中,addFrame
则生成的电影具有独特的帧,但我无法调整帧顺序。
创建和重用CVPixelBufferRef数组的正确方法是什么?会pixelBufferPool
有所帮助,如果可以,我该如何使用它?
谢谢你。