Как создать и повторно использовать массив CVPixelBufferRef?

В моем приложении мне нужно

  1. Создайте 24 CVPixelBufferRef
  2. Добавьте их позже в 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, и если да, то как я могу его использовать?

Спасибо.


person Thinium    schedule 23.06.2017    source источник


Ответы (1)


Хорошо, нашел проблему.

В моей функции addFrame unsigned char * pixels уничтожался после каждого вызова addFrame. Но чтобы массив buffers можно было использовать позже, пиксели должны оставаться живыми до тех пор, пока массив buffers не будет уничтожен.

person Thinium    schedule 27.06.2017