如何创建和重复使用CVPixelBufferRef



在我的应用程序中,我需要

  1. 创建24 cvpixelbufferref
  2. 稍后将它们添加到 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数组被破坏为止。

相关内容

  • 没有找到相关文章

最新更新