BGRA 到 YUV420 FFmpeg 给出错误的输出

BGRA to YUV420 FFmpeg giving bad output

我的目的是做一个屏幕录像机。我正在使用 Windows DXGI API 接收屏幕截图,我正在使用 libx264 将屏幕截图编码为视频。将 BGRA 图像直接馈送到 libx264 会在输出视频中产生奇怪的颜色。因此,为了获得正确的颜色,我正在尝试将 BGRA 转换为 YUV420p。为了加快编码速度,我也在尝试缩小BGRA图像。

所以我得到一张 1920x1080 BGRA 图像,我想将它转换为 1280x720 YUV420p。为此,我使用 FFmpeg swscale 库来进行格式转换和缩小。

问题是输出视频像 3 张图像一样出现在同一帧中。请看这个视频。 https://imgur.com/a/EYimjrJ

我只尝试了 BGRA 到 YUV 的转换,没有任何缩小,它工作正常。但是 BGRA 到 YUV 缩小比例会出现这个问题。

这个问题的原因是什么?我该如何解决?

这是我的代码片段:

uint8_t* Image;
x264_picture_t picIn, picOut;
x264_picture_alloc(&picIn, X264_CSP_I420, 1280, 720);

SwsContext* sws = sws_getContext(1920, 1080, AV_PIX_FMT_BGRA, 1280, 720, AV_PIX_FMT_YUV420P, SWS_BILINEAR, NULL, NULL, NULL);

while (true)
{
    take_screenshot(&Image);

    AVFrame BGRA;
    BGRA.linesize[0] = 1280 * 4;
    BGRA.data[0] = Image;
    sws_scale(sws, BGRA.data, BGRA.linesize, 0, 1080, picIn.img.plane, picIn.img.i_stride);

    nal_size = x264_encoder_encode(h, &nals, &nal_count, &picIn, &picOut);
    save_to_flv(nals, nal_size, nal_count);
}

这是我的 libx264 参数:

        x264_param_default_preset(&param, preset, 0);
        param.i_csp = X264_CSP_I420;
        param.i_width = 1280;
        param.i_height = 720;
        param.i_fps_num = 30;
        param.i_fps_den = 1;
        param.rc.i_bitrate = 2500;
        param.i_bframe = 0;
        param.b_repeat_headers = 0;
        param.b_annexb = 1;     

        x264_param_apply_profile(&param, 0);
        h = x264_encoder_open(&param);

BGRA.linesize[0] 更改为 1920*4。您看到此 3 张图片 模式是因为

1240*3 == 1920*2