从BGRA到YUV420 FFmpeg的输出不正确

如何解决从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_'}]}";

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?