В моем приложении мне нужно
- Создайте 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
, и если да, то как я могу его использовать?
Спасибо.