我的目的是做一个屏幕记录器。我正在使用Windows DXGI API接收屏幕截图,并使用libx264将屏幕截图编码为视频。将BGRA图像直接馈送到libx264会在输出视频中产生奇怪的颜色。因此,为了获得正确的颜色,我正在尝试将BGRA转换为YUV420p。为了加快编码速度,我还试图缩小BGRA图像的比例。
所以我得到了一个1920x1080的BGRA图像,我想把它转换成1280x720的YUV420p。为此,我使用FFmpeg swscale库来进行格式转换和缩小。
问题是,输出视频就像同一帧中的3个图像一样。请看此视频。https://i.stack.imgur.com/pmPGC.jpg
我只尝试了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(¶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);
将BGRA.linesize[0]
更改为1920*4
。您可以看到3图像模式,因为
1240*3 == 1920*2