如何创建和重用CVPixelBufferRef数组?

时间:2017-06-23 08:29:01

标签: ios arrays core-video cvpixelbuffer

在我的申请中,我需要

  1. 创建24 CVPixelBufferRef
  2. 稍后在自定义顺序中将它们添加到 AVAssetWriterInputPixelBufferAdaptor 以编写mp4电影。
  3. 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会有所帮助,如果有,我该如何使用?

    谢谢。

1 个答案:

答案 0 :(得分:0)

好的,找到了问题。

在我的addFrame函数中,unsigned char * pixels在每次调用addFrame后都被销毁了。但为了使buffers数组稍后可用,像素需要保持活动状态,直到buffers数组被销毁。