C++ ffmpeg sws#U缩放YUV420p到RGBA未给出正确的缩放结果(c+;+;)

C++ ffmpeg sws#U缩放YUV420p到RGBA未给出正确的缩放结果(c+;+;),c++,video,ffmpeg,yuv,rgba,C++,Video,Ffmpeg,Yuv,Rgba,我试图通过sws_scale将解码的YUV420p帧(1018x700)缩放为RGBA,我将数据保存到原始视频文件,然后使用ffplay播放原始视频以查看结果 这是我的密码: sws_ctx = sws_getContext(video_dec_ctx->width, video_dec_ctx->height,AV_PIX_FMT_YUV420P, video_dec_ctx->width, video_dec_ctx->height, AV_PIX_FMT_BGR32

我试图通过sws_scale将解码的YUV420p帧(1018x700)缩放为RGBA,我将数据保存到原始视频文件,然后使用ffplay播放原始视频以查看结果

这是我的密码:

sws_ctx = sws_getContext(video_dec_ctx->width, video_dec_ctx->height,AV_PIX_FMT_YUV420P, video_dec_ctx->width, video_dec_ctx->height, AV_PIX_FMT_BGR32, SWS_LANCZOS | SWS_ACCURATE_RND, 0, 0, 0);
ret = avcodec_decode_video2(video_dec_ctx, yuvframe, got_frame, &pkt);
    if (ret < 0) {
        std::cout<<"Error in decoding"<<std::endl;
        return ret;
    }else{
        //the source and destination heights and widths are the same
        int sourceX = video_dec_ctx->width;
        int sourceY = video_dec_ctx->height;
        int destX = video_dec_ctx->width;
        int destY = video_dec_ctx->height;

        //declare destination frame
        AVFrame avFrameRGB;
        avFrameRGB.linesize[0] = destX * 4;
        avFrameRGB.data[0] = (uint8_t*)malloc(avFrameRGB.linesize[0] * destY);

        //scale the frame to avFrameRGB
        sws_scale(sws_ctx, yuvframe->data, yuvframe->linesize, 0, yuvframe->height, avFrameRGB.data, avFrameRGB.linesize);

        //write to file
        fwrite(avFrameRGB.data[0], 1, video_dst_bufsize, video_dst_file);
 }

我应该解决什么问题才能使RGB32实现正确的缩放?

我找到了解决方案,这里的问题是我没有使用正确的缓冲区大小写入文件

fwrite(avFrameRGB.data[0], 1, video_dst_bufsize, video_dst_file);
变量video_dst_文件是从的返回值中获取的

video_dst_bufsize = av_image_alloc(yuvframe.data, yuvframe.linesize, destX, destY, AV_PIX_FMT_YUV420P, 1);
解决方案是从中获取返回值,并在fwrite语句中使用:

video_dst_bufsize_RGB = av_image_alloc(avFrameRGB.data, avFrameRGB.linesize, destX, destY, AV_PIX_FMT_BGR32, 1);

fwrite(avFrameRGB.data[0], 1, video_dst_bufsize_RGB, video_dst_file);

endianness不同-使用
bgr32
尝试ffplay,您的问题文本显示为1024x76,但您的ffplay为1024x760-使用不同的Y值进行实验,看看是否得到正确的输出。这应该有助于调试。表面上看,
avFrameRGB.linesize[0]
应该是3072=1024x3;但是你发布了缩放后的图像,所以很难说这里到底发生了什么。@Alex Cohn更新了尺寸1018,我发布了新结果。为什么要将RGBA中的行大小乘以3?RGB是*3,RGBA是*4?
video_dst_bufsize_RGB = av_image_alloc(avFrameRGB.data, avFrameRGB.linesize, destX, destY, AV_PIX_FMT_BGR32, 1);

fwrite(avFrameRGB.data[0], 1, video_dst_bufsize_RGB, video_dst_file);