RGB到x264:奇怪的颜色渲染

时间:2014-01-14 10:50:20

标签: opengl video rgb x264

我正在尝试从OpenGl上下文制作视频。

我正在使用glReadPixel,以确保RGB缓冲区数据是好的我将它保存到bmp文件中,我可以正确读取。

我的.h264视频已编码,但有一些人工制品,我不明白为什么。 我为x264_param_t尝试了很多不同的参数但是更好!

保存位图(OpenGL实际数据):Bitmap from OpenGl(1mo)

原始h264,错误:Raw h264 video(1mo)

OpenGl ReadPixel:

int nSize = ClientHeight * ClientWidth * 3;
GLubyte *inBuff = new GLubyte[nSize];
glReadBuffer(GL_FRONT);
glReadPixels(0, 0, ldwidth, ldheight, GL_BGR, GL_UNSIGNED_BYTE, inBuff);

params定义:

x264_param_default(&mX264_param_t);
x264_param_default_preset(&mX264_param_t, "placebo", "film");

mX264_param_t.i_csp = X264_CSP_BGR;
mX264_param_t.i_threads = 6;
mX264_param_t.i_width = mWidth;
mX264_param_t.i_height = mHeight;

mX264_param_t.i_fps_num = mFps;
mX264_param_t.i_fps_den = 1;

// Intra refres:
mX264_param_t.i_keyint_max = mFps;
mX264_param_t.b_intra_refresh = 1;

//Rate control:
mX264_param_t.rc.i_rc_method = X264_RC_CRF;
mX264_param_t.rc.f_rf_constant = 25;
mX264_param_t.rc.f_rf_constant_max = 35;

int bps = 5000;
mX264_param_t.rc.i_bitrate = bps;
mX264_param_t.rc.i_vbv_max_bitrate = bps;
mX264_param_t.i_bframe = 2;
mX264_param_t.i_keyint_min = mFps / 4;
//For streaming:
mX264_param_t.b_repeat_headers = 1;
mX264_param_t.b_annexb = 1;
mX264_param_t.i_log_level = X264_LOG_DEBUG;
x264_param_apply_profile(&mX264_param_t, "baseline");

mpEncoder = x264_encoder_open(&mX264_param_t);
x264_encoder_parameters(mpEncoder, &mX264_param_t);



mpPictureOut = new x264_picture_t();
mpPictureIn = new x264_picture_t();

x264_picture_alloc(mpPictureIn, X264_CSP_BGR | X264_CSP_VFLIP, mWidth, mHeight);

然后是编码循环:

mpPictureIn->img.i_csp = X264_CSP_BGR;

mpPictureIn->img.i_plane = 1;
mpPictureIn->img.i_stride[0] = 3 * mWidth;
mpPictureIn->img.plane[0] = rgbframe;

mpPictureIn->i_pts = mFrameCount;
mpPictureIn->i_type = X264_TYPE_AUTO;

mpPictureOut->i_pts = mFrameCount;

int i_nals;
x264_nal_t* nals;
int frame_size = x264_encoder_encode(mpEncoder, &nals, &i_nals, mpPictureIn, mpPictureOut);

if(frame_size > 0)
{
mpFileOut->write_frame(nals[0].p_payload, frame_size, mpPictureOut);
mFrameCount++;
}

写帧:

int TVideoFileWriter::write_frame(uint8_t *p_nalu, int i_size, x264_picture_t *p_picture)
{
if(fwrite(p_nalu, i_size, 1, mFileHandle))
    return i_size;
return -1;
}

1 个答案:

答案 0 :(得分:1)

您以文本模式(而非二进制模式)打开输出文件,因此所有0x0A字节都替换为0x0D 0x0A字节。

以下是此替换的输出已恢复:out_fixed.h264

它播放得很好。