我正在使用FFMpeg解码视频,并希望使用OpenGL编辑解码后的帧,但为了做到这一点,我需要将AVFrame中的数据从YUV转换为RGB。
为了实现这一点,我创建了一个新的AVFrame:
创建转换上下文:
但是在运行时会出现“[swscaler @ 0x123f15000] bad dst image pointers”错误。当我查看FFMpeg的源代码时,发现输出帧的数据没有初始化,但我不知道应该如何初始化。
所有现有的答案或教程(参见示例)似乎都使用已弃用的API,并且不清楚如何使用新的API。我将感激任何帮助。
为了实现这一点,我创建了一个新的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的源代码时,发现输出帧的数据没有初始化,但我不知道应该如何初始化。
所有现有的答案或教程(参见示例)似乎都使用已弃用的API,并且不清楚如何使用新的API。我将感激任何帮助。
malloc
分配内存。关键在于它不一定要是一个AvFrame
。但你的问题是第一个问题。 - Yakov Galka