有人用过x264吗,我改的x264编码后的视频全是马赛克,大侠们帮我看看啊

izardMan 2012-08-27 01:50:50

void CEncode264::Encode(BYTE* pInData, int nLen/*, BYTE* pOutBuf, int *nOutLen, int *nKeyFrame*/)
{

if((nLen != myParam.i_width * myParam.i_height * 3) ||(pInData==NULL) )
return;
BYTE* pOutBuf=NULL;
int nOutLen=0;
myParam.i_frame_total ++;
memcpy(m_Pic.img.plane[0], pInData, myParam.i_width * myParam.i_height);
memcpy(m_Pic.img.plane[1], pInData + myParam.i_width * myParam.i_height, myParam.i_width * myParam.i_height / 4);
memcpy(m_Pic.img.plane[2], pInData + myParam.i_width * myParam.i_height * 5 / 4, myParam.i_width * myParam.i_height / 4);
m_Pic.i_pts = (int64_t)myParam.i_frame_total * myParam.i_fps_den;
static x264_picture_t pic_out;
x264_nal_t *nal = NULL;
int i_nal, i;
if( &m_Pic )
{
m_Pic.i_type = X264_TYPE_AUTO;
m_Pic.i_qpplus1 = 0; } //TraceTime("x264_encoder_encode begin");
if( x264_encoder_encode( h, &nal, &i_nal, &m_Pic, &pic_out ) < 0 )
{
return;
}
//TraceTime("x264_encoder_encode end");
int nOutCanUse = nOutLen; nOutLen = 0;
for( i = 0; i < i_nal; i++ )
{ int i_size = 0;
if( nOutCanUse < nal[i].i_payload * 3/2 + 4 ) //确认足够大的缓冲区
{
nOutCanUse = nal[i].i_payload * 2 + 4; //2倍VLC长度+4
x264_free( pOutBuf ); //释放前面申请的MUX_BUFFER
pOutBuf = (uint8_t *)x264_malloc( nOutCanUse ); //申请当前大小的缓冲区
}

i_size = nOutCanUse;

if( ( i_size = x264_nal_encode( pOutBuf , &nOutCanUse, 1, &nal[i] ) ) > 0 ) // + *nOutLen
{
/* *nOutLen += i_size;
nOutCanUse -= i_size; */
fwrite(pOutBuf,i_size,1, fout );

}
}
// pic_out.i_type==X264_TYPE_IDR;
}
...全文
685 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
郭衍清 2013-10-10
  • 打赏
  • 举报
回复
我在做这个 求指教
nanqingzhe 2013-03-01
  • 打赏
  • 举报
回复
看看帧率 码率 * 1 s = 帧率 * 1s * 每帧大小(平均)
izardMan 2012-09-07
  • 打赏
  • 举报
回复
的确是码率低的事,不过还有个问题就是视频压缩后帧少了好多,播放一下速度好快,是不是电脑速度跟不上,还是要开线程压缩,我会加分的
LiuYinChina 2012-09-07
  • 打赏
  • 举报
回复

void x264_param_set(x264_param_t *p_x264_param, int i_width, int i_height, int i_fps, int i_keyint_min, int i_keyint_max)
{
x264_param_default(p_x264_param);

p_x264_param->i_threads = 0;
p_x264_param->b_deterministic = 1;

/* Video properties */
p_x264_param->i_csp = X264_CSP_I420;
p_x264_param->i_width = i_width;
p_x264_param->i_height = i_height;
p_x264_param->vui.i_sar_width = 0;
p_x264_param->vui.i_sar_height = 0;
p_x264_param->vui.i_overscan = 0; /* undef */
p_x264_param->vui.i_vidformat = 5; /* undef */
p_x264_param->vui.b_fullrange = 0; /* off */
p_x264_param->vui.i_colorprim = 2; /* undef */
p_x264_param->vui.i_transfer = 2; /* undef */
p_x264_param->vui.i_colmatrix = 2; /* undef */
p_x264_param->vui.i_chroma_loc = 0; /* left center */
p_x264_param->i_fps_num = i_fps;
p_x264_param->i_fps_den = 1;
p_x264_param->i_level_idc = -1;

/* Encoder parameters */
p_x264_param->i_frame_reference = 1;
p_x264_param->i_keyint_max = i_keyint_max;
p_x264_param->i_keyint_min = i_keyint_min;
p_x264_param->i_bframe = 0;
p_x264_param->i_scenecut_threshold = 40;
p_x264_param->i_bframe_adaptive = X264_B_ADAPT_FAST;
p_x264_param->i_bframe_bias = 0;
p_x264_param->b_bframe_pyramid = 0;

p_x264_param->b_deblocking_filter = 1;
p_x264_param->i_deblocking_filter_alphac0 = 0;
p_x264_param->i_deblocking_filter_beta = 0;

p_x264_param->b_cabac = 0;
p_x264_param->i_cabac_init_idc = 0;

p_x264_param->rc.i_rc_method = X264_RC_CQP;
p_x264_param->rc.i_bitrate = 2000;
p_x264_param->rc.f_rate_tolerance = 1.0;
p_x264_param->rc.i_vbv_max_bitrate = 0;
p_x264_param->rc.i_vbv_buffer_size = 0;
p_x264_param->rc.f_vbv_buffer_init = 0.9;
p_x264_param->rc.i_qp_constant = 28;
p_x264_param->rc.f_rf_constant = 0;
p_x264_param->rc.i_qp_min = 10;
p_x264_param->rc.i_qp_max = 51;
p_x264_param->rc.i_qp_step = 4;
p_x264_param->rc.f_ip_factor = 1.4;
p_x264_param->rc.f_pb_factor = 1.3;
p_x264_param->rc.i_aq_mode = X264_AQ_NONE;
p_x264_param->rc.f_aq_strength = 1.0;

p_x264_param->rc.b_stat_write = 0;
p_x264_param->rc.b_stat_read = 0;
p_x264_param->rc.f_qcompress = 0.6;
p_x264_param->rc.f_qblur = 0.5;
p_x264_param->rc.f_complexity_blur = 20;
p_x264_param->rc.i_zones = 0;
p_x264_param->i_log_level = X264_LOG_INFO;

p_x264_param->analyse.intra = X264_ANALYSE_I4x4|X264_ANALYSE_I8x8;
p_x264_param->analyse.inter = X264_ANALYSE_I4x4|X264_ANALYSE_I8x8|X264_ANALYSE_PSUB16x16;
p_x264_param->analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL;
p_x264_param->analyse.i_me_method = X264_ME_DIA;
p_x264_param->analyse.f_psy_rd = 1.0;
p_x264_param->analyse.f_psy_trellis = 0;
p_x264_param->analyse.i_me_range = 16;
p_x264_param->analyse.i_subpel_refine = 3;
p_x264_param->analyse.b_chroma_me = 0;
p_x264_param->analyse.i_mv_range_thread = -1;
p_x264_param->analyse.i_mv_range = -1;
p_x264_param->analyse.i_chroma_qp_offset = 0;
p_x264_param->analyse.b_fast_pskip = 1;
p_x264_param->analyse.b_dct_decimate = 1;
p_x264_param->analyse.i_luma_deadzone[0] = 21;
p_x264_param->analyse.i_luma_deadzone[1] = 11;
p_x264_param->analyse.b_psnr = 0;
p_x264_param->analyse.b_ssim = 0;

p_x264_param->i_cqm_preset = X264_CQM_FLAT;
FillMemory(p_x264_param->cqm_4iy, 16, 16);
FillMemory(p_x264_param->cqm_4ic, 16, 16);
FillMemory(p_x264_param->cqm_4py, 16, 16);
FillMemory(p_x264_param->cqm_4pc, 16, 16);

p_x264_param->b_repeat_headers = 1;
p_x264_param->b_aud = 0;
}

//////////////////////////////////////////////////////////////////////////

int x264_encode(x264_t *i_x264, x264_nal_t **i_x264_nal, int *i_nal_count, uint8_t *i_yv12, int i_width, int i_height, int64_t i_pts)
{
x264_picture_t pic_input = { 0 };
x264_picture_t pic_output = { 0 };

pic_input.i_type = X264_TYPE_AUTO;
pic_input.i_pts = i_pts;

pic_input.img.i_csp = X264_CSP_I420;
pic_input.img.i_plane = 3;
pic_input.img.i_stride[0] = i_width;
pic_input.img.i_stride[1] = pic_input.img.i_stride[0] >> 1;
pic_input.img.i_stride[2] = pic_input.img.i_stride[1];

pic_input.img.plane[0] = i_yv12;
pic_input.img.plane[1] = i_yv12 + i_width * i_height + (i_width * i_height >> 2);
pic_input.img.plane[2] = i_yv12 + i_width * i_height;

return x264_encoder_encode(i_x264, i_x264_nal, i_nal_count, &pic_input, &pic_output);
}
izardMan 2012-09-06
  • 打赏
  • 举报
回复

void x264_param_default( x264_param_t *param )
{
/* */
memset( param, 0, sizeof( x264_param_t ) );

/* CPU autodetect */
param->cpu = x264_cpu_detect();
param->i_threads = 1;
param->b_deterministic = 1;

/* Video properties */
param->i_csp = X264_CSP_I420;
param->i_width = 0;
param->i_height = 0;
param->vui.i_sar_width = 0;
param->vui.i_sar_height= 0;
param->vui.i_overscan = 0; /* undef */
param->vui.i_vidformat = 5; /* undef */
param->vui.b_fullrange = 0; /* off */
param->vui.i_colorprim = 2; /* undef */
param->vui.i_transfer = 2; /* undef */
param->vui.i_colmatrix = 2; /* undef */
param->vui.i_chroma_loc= 0; /* left center */
param->i_fps_num = 25;
param->i_fps_den = 1;
param->i_level_idc = -1;

/* Encoder parameters */
param->i_frame_reference = 1;
param->i_keyint_max = 250;
param->i_keyint_min = 25;
param->i_bframe = 0;
param->i_scenecut_threshold = 40;
param->b_bframe_adaptive = 1;
param->i_bframe_bias = 0;
param->b_bframe_pyramid = 0;

param->b_deblocking_filter = 1;
param->i_deblocking_filter_alphac0 = 0;
param->i_deblocking_filter_beta = 0;

param->b_cabac = 1;
param->i_cabac_init_idc = 0;

param->rc.i_rc_method = X264_RC_NONE;
param->rc.i_bitrate = 0;
param->rc.f_rate_tolerance = 1.0;
param->rc.i_vbv_max_bitrate = 0;
param->rc.i_vbv_buffer_size = 0;
param->rc.f_vbv_buffer_init = 0.9;
param->rc.i_qp_constant = 26;
param->rc.f_rf_constant = 0;
param->rc.i_qp_min = 10;
param->rc.i_qp_max = 51;
param->rc.i_qp_step = 4;
param->rc.f_ip_factor = 1.4;
param->rc.f_pb_factor = 1.3;
param->rc.i_aq_mode = X264_AQ_GLOBAL;
param->rc.f_aq_strength = 1.0;

param->rc.b_stat_write = 0;
param->rc.psz_stat_out = "x264_2pass.log";
param->rc.b_stat_read = 0;
param->rc.psz_stat_in = "x264_2pass.log";
param->rc.f_qcompress = 0.6;
param->rc.f_qblur = 0.5;
param->rc.f_complexity_blur = 20;
param->rc.i_zones = 0;

/* Log */
param->pf_log = x264_log_default;
param->p_log_private = NULL;
param->i_log_level = X264_LOG_INFO;

/* */
param->analyse.intra = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8;
param->analyse.inter = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8
| X264_ANALYSE_PSUB16x16 | X264_ANALYSE_BSUB16x16;
param->analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL;
param->analyse.i_me_method = X264_ME_HEX;
param->analyse.i_me_range = 16;
param->analyse.i_subpel_refine = 5;
param->analyse.b_chroma_me = 1;
param->analyse.i_mv_range_thread = -1;
param->analyse.i_mv_range = -1; // set from level_idc
param->analyse.i_direct_8x8_inference = 1;
param->analyse.i_chroma_qp_offset = 0;
param->analyse.b_fast_pskip = 1;
param->analyse.b_dct_decimate = 1;
param->analyse.i_luma_deadzone[0] = 21;
param->analyse.i_luma_deadzone[1] = 11;
param->analyse.b_psnr = 1;
param->analyse.b_ssim = 1;

param->i_cqm_preset = X264_CQM_FLAT;
memset( param->cqm_4iy, 16, 16 );
memset( param->cqm_4ic, 16, 16 );
memset( param->cqm_4py, 16, 16 );
memset( param->cqm_4pc, 16, 16 );
memset( param->cqm_8iy, 16, 64 );
memset( param->cqm_8py, 16, 64 );

param->b_repeat_headers = 1;
param->b_aud = 0;
}
izardMan 2012-09-05
  • 打赏
  • 举报
回复

x264_param_default( &myParam );
myParam.i_threads = 1;
myParam.i_frame_total = 0;
myParam.i_width = m_nWidth;
myParam.i_height = m_nHeight;
myParam.i_keyint_min = m_nKeyInterval; //25
myParam.i_keyint_max = m_nKeyInterval * 10;
myParam.i_fps_num = m_nFps; //25
myParam.i_log_level = X264_LOG_NONE;
myParam.rc.i_rc_method=2;

lizhigang34 2012-08-30
  • 打赏
  • 举报
回复
看看你初始化那段代码
izardMan 2012-08-30
  • 打赏
  • 举报
回复
还没搞定,等264的高人
izardMan 2012-08-27
  • 打赏
  • 举报
回复
有可能是每秒执行不了那么多次导致的吗,那需要怎么优化
izardMan 2012-08-27
  • 打赏
  • 举报
回复
参数初始化了,码率是25,
shangqt 2012-08-27
  • 打赏
  • 举报
回复
这个是编码线程函数了。。看看你的初始化参数吧,可能是码率太低了
izardMan 2012-08-27
  • 打赏
  • 举报
回复
自己顶起,,
izardMan 2012-08-27
  • 打赏
  • 举报
回复
顶起,高手呢

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧