Неправильная инициализация AVFrame для преобразования sws_scale - PullRequest
1 голос
/ 31 марта 2019

Я декодирую видео, используя FFMpeg, и хочу редактировать декодированные кадры, используя OpenGL, но для этого мне нужно преобразовать данные в AVFrame из YUV в RGB.

Для этого я создаю новый AVFrame:

AVFrame *inputFrame = av_frame_alloc();
AVFrame *outputFrame = av_frame_alloc();
av_image_alloc(outputFrame->data, outputFrame->linesize, width, height, AV_PIX_FMT_RGB24, 1);
av_image_fill_arrays(outputFrame->data, outputFrame->linesize, NULL, AV_PIX_FMT_RGB24, width, height, 1);

Создать контекст конвертации:

struct SwsContext *img_convert_ctx = sws_getContext(width, height, AV_PIX_FMT_YUV420P,
                                                  width, height, AV_PIX_FMT_RGB24,
                                                  0, NULL, NULL, NULL);

А затем попробуйте преобразовать его в RGB:

sws_scale(img_convert_ctx, (const uint8_t *const *)&inputFrame->data, inputFrame->linesize, 0, inputFrame->height, outputFrame->data, outputFrame->linesize);

Но это вызывает ошибку «[swscaler @ 0x123f15000] bad dst image pointers» во время выполнения. Когда я просмотрел исходный код FFMpeg, я обнаружил, что причина в том, что данные outputFrame не были инициализированы, но я не понимаю, как это должно быть.

Все существующие ответы или учебники, которые я нашел ( см. Пример ), похоже, используют устаревшие API, и неясно, как использовать новые API. Буду признателен за любую помощь.

1 Ответ

1 голос
/ 31 марта 2019

Вот как я звоню sws_scale:

image buf2((buf.w + 15)/16*16, buf.h, 3);
sws_scale(sws_ctx, (const uint8_t * const *)frame->data, frame->linesize, 0, c->height, (uint8_t * const *)buf2.c, &buf2.ys);

Здесь есть два различия:

  1. Вы передаете &inputFrame->data, но это будет inputFrame->dataбез оператора адреса.

  2. Вам не нужно выделять структуру второго кадра.sws_scale не заботится об этом.Ему просто нужен кусок памяти правильного размера (и, возможно, выравнивания).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...