我的目的是一个屏幕录像机。我正在使用Windows DXGI API接收屏幕快照,并且正在使用libx264将屏幕快照编码为视频。将BGRA图像直接馈送到libx264会在输出视频中产生奇怪的颜色。因此,为了获得正确的颜色,我正在尝试将BGRA转换为YUV420p。为了加快编码速度,我还尝试缩小BGRA图像的尺寸。
所以我得到一个1920x1080 BGRA图像,我想将其转换为1280x720 YUV420p。为此,我正在使用FFmpeg swscale库来进行格式转换和缩小。
问题在于,输出视频在同一帧中像3张图像一样出现。请观看此视频。 https://imgur.com/a/EYimjrJ
我尝试了从BGR​​A到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

09-12 17:51