从BGRA到YUV420 FFmpeg的输出不正确

问题描述

我的目的是做一个屏幕录像机。我正在使用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,720,AV_PIX_FMT_YUV420P,SWS_BILINEAR,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,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);

解决方法

1920*4更改为1240*3 == 1920*2 。您看到此 3张图片模式,因为

"{items:[{'id':'1','name':'DISP_1'},{'id':'2','name':'DISP_2'},{'id':'3','name':'sa'},{'id':'4','name':'DISP_'}]}";

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...