Opengl 无法正确初始化用于sws_比例转换的AVFrame
我正在使用FFMpeg解码视频,并希望使用OpenGL编辑解码的帧,但为了做到这一点,我需要将AVFrame中的数据从YUV转换为RGB 为此,我创建了一个新的AVFrame:Opengl 无法正确初始化用于sws_比例转换的AVFrame,opengl,ffmpeg,Opengl,Ffmpeg,我正在使用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
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]错误dst映像指针”错误。当我查看FFMpeg的源代码时,我发现原因是outputFrame的数据没有初始化,但我不明白应该如何初始化
我找到的所有现有答案或教程()似乎都使用了不推荐的API,而且不清楚如何使用新的API。非常感谢您的帮助。以下是我如何称呼sws\U 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);
这里有两个区别:
&inputFrame->data
,但它应该是inputFrame->data
,不带操作员地址sws\u量表不关心它。它只需要一块大小合适的内存(可能还需要对齐)
在我的例子中,av_image_alloc/av_image_fill_数组没有创建帧->数据指针 我是这样做的,不确定是否一切都正确,但它是有效的:
d->m_FrameCopy = av_frame_alloc();
uint8_t* buffer = NULL;
int numBytes;
// Determine required buffer size and allocate buffer
numBytes = avpicture_get_size(
AV_PIX_FMT_RGB24, d->m_Frame->width, d->m_Frame->height);
buffer = (uint8_t*)av_malloc(numBytes * sizeof(uint8_t));
avpicture_fill(
(AVPicture*)d->m_FrameCopy,
buffer,
AV_PIX_FMT_RGB24,
d->m_Frame->width,
d->m_Frame->height);
d->m_FrameCopy->format = AV_PIX_FMT_RGB24;
d->m_FrameCopy->width = d->m_Frame->width;
d->m_FrameCopy->height = d->m_Frame->height;
d->m_FrameCopy->channels = d->m_Frame->channels;
d->m_FrameCopy->channel_layout = d->m_Frame->channel_layout;
d->m_FrameCopy->nb_samples = d->m_Frame->nb_samples;
什么是“image”结构?@nihohit:我自己的image类——它只是使用
malloc
分配内存。关键是它不必是AvFrame
。但你的问题是第一个。