在我的应用程序中,我需要
- 创建24 cvpixelbufferref
- 稍后将它们添加到 AvassetWriterIterInputPixelBufferadaptor 在自定义订单中以编写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
函数中,每个addframe调用后unsigned char * pixels
被销毁。但是要使buffers
数组稍后可用,像素需要保持活力,直到buffers
数组被破坏为止。