簡體   English   中英

RGB至x264:奇怪的顏色渲染

[英]RGB to x264 : Strange color render

我正在嘗試從OpenGl上下文制作視頻。

我正在使用glReadPixel,以確保RGB緩沖區數據正常,然后將其保存到bmp文件中,直到我可以正確讀取為止。

我的.h264視頻已編碼,但是有一些偽影,我不明白為什么。 我為x264_param_t嘗試了很多不同的參數,但還有更好的選擇!

已保存位圖(OpenGL實際數據): 來自OpenGl的位圖 (1mo)

原始h264出現錯誤: 原始h264視頻 (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);

參數定義:

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;
}

您以文本模式(而非二進制模式)打開了輸出文件,因此所有0x0A字節都替換為0x0D 0x0A字節。

這是還原后的替換輸出: out_fixed.h264

而且效果很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM