Opengl 无法正确初始化用于sws_比例转换的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

我正在使用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]错误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
    。但你的问题是第一个。