【问题标题】:ffmpeg sws_scale YUV420p to RGBA not giving correct scaling result (c++)ffmpeg sws_scale YUV420p 到 RGBA 没有给出正确的缩放结果(c++)
【发布时间】:2016-02-02 07:00:12
【问题描述】:

我正在尝试通过 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);
 }

这是没有缩放的结果(即 YUV420p 格式)

这是使用 ffplay 播放时的缩放后(即 RGBA 格式)

我使用以下命令运行 ffplay('video' 是原始视频文件)

ffplay -f rawvideo -pix_fmt bgr32 -video_size 1018x700 video

我应该如何解决才能使 RGB32 发生正确的缩放?

【问题讨论】:

  • 字节序不同 - 用bgr32试试ffplay
  • 您的问题文本显示为 1024x76,但您的 ffplay 为 1024x760 - 尝试不同的 Y 值,看看您是否得到正确的输出。这应该可以帮助您调试。
  • 从表面上看,avFrameRGB.linesize[0] 应该是 3072 = 1024x3;但是你发布了缩放的图像,所以很难说这里到底发生了什么。
  • @Alex Cohn Ive 更新了 1018 的尺寸,我发布了新结果。为什么我要乘以 3 来表示 RGBA 中的线宽? RGB 是 *3,RGBA 是 *4?

标签: c++ video ffmpeg yuv rgba


【解决方案1】:

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

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

变量 video_dst_file 是从返回值中获取的

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);

【讨论】:

    猜你喜欢
    • 2016-04-15
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    相关资源
    最近更新 更多