Заполните данные кадра BGR в FFMPEG
Я следую приведенному здесь примеру с видео FFmpeg, но он делает несколько фиктивных кадров YUV420P, и у меня уже есть изображение BGR, снятое с камеры.
Я не уверен, как использовать frame->data[]
а также frame->linesize[]
вместо того, чтобы заполнить их своим изображением BGR, чтобы я мог кодировать видео H264.
РЕДАКТИРОВАТЬ:
У меня есть следующий код (он вызывается для каждой новой картинки, которую посылает камера) после ответа Рональда:
.............
AVFrame *bgrFrame = av_frame_alloc();
bgrFrame->width = originalBGRImage.cols;
bgrFrame->height = originalBGRImage.rows;
ret = av_image_alloc(bgrFrame->data, bgrFrame->linesize, bgrFrame->width, bgrFrame->height, AV_PIX_FMT_BGR24, 32);
/////////////////////////////////////
// This works and prevents memory leak....if I remove it, it consumes all the RAM....but I can't free this memory here, since I will use it later...
av_freep(&bgrFrame->data[0]);
av_frame_free(&bgrFrame);
return;
/////////////////////////////////////
ret = av_image_fill_pointers(bgrFrame->data, AV_PIX_FMT_BGR24, bgrFrame->height, originalBGRImage.data, bgrFrame->linesize);
/////////////////////////////////////
// Here is where I am done using the memory so I will want to free it...but this same code crashes the program.
av_freep(&bgrFrame->data[0]);
av_frame_free(&bgrFrame);
return;
/////////////////////////////////////
Так что, если я удалю av_freep(&bgrFrame->data[0]);
в конце кода у меня будет утечка памяти... но оставляя ее там, вылетает сбой.... так, как правильно освободить использованную память?
1 ответ
Используйте av_image_fill_linesizes(), чтобы заполнить размеры строк (если они не дополнены, в этом случае вы должны указать их вручную), а после этого использовать av_image_fill_pointers(), чтобы заполнить указатели данных. В качестве pix_fmt используйте AV_PIX_FMT_BGR24.
Теперь это дает вам изображение BGR24. Вы можете кодировать его как образ RGB H264, используя кодировщик libx264rgb. Если вы хотите кодировать YUV H264, вам сначала нужно преобразовать RGB-изображение в YUV, что вы можете сделать с помощью libswscale. Google "пример libswscale", чтобы найти пример кода о том, как это сделать.