如何解决从BGRA到YUV420 FFmpeg的输出不正确
我的目的是做一个屏幕录像机。我正在使用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,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(¶m,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(¶m,0);
h = x264_encoder_open(¶m);
解决方法
将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 举报,一经查实,本站将立刻删除。