Я декодирую видео, используя 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. Буду признателен за любую помощь.