x264编解码结果用暴风音影播放是提示无效文件,怎么办?
美丽海洋 2011-08-03 10:26:39 如题:希望做过这方面的能给说说 谢谢顶贴者
源码如下:
参数设置:
x264_param_default( &m_x264_param_t );
m_x264_param_t.i_csp = X264_CSP_I420;
m_x264_param_t.rc.psz_stat_out = (char*)malloc (MAX_PATH);
m_x264_param_t.rc.psz_stat_in = (char*)malloc (MAX_PATH);
m_x264_param_t.i_threads = 1;
m_x264_param_t.analyse.i_noise_reduction = 0;
m_x264_param_t.i_log_level = X264_LOG_NONE;
m_x264_param_t.p_log_private = NULL;
m_x264_param_t.analyse.b_psnr = 0;
m_x264_param_t.i_width = w;
m_x264_param_t.i_height= h;
m_x264_param_t.i_fps_num = 10;
m_x264_param_t.i_fps_den = 1;
m_x264_param_t.i_frame_total = 0;
m_x264_param_t.i_frame_reference = 1;
m_x264_param_t.i_bframe = 0;
m_x264_param_t.i_keyint_min = 25;
m_x264_param_t.i_keyint_max = 250;
m_x264_param_t.i_scenecut_threshold = 40;
m_x264_param_t.b_deblocking_filter = 0;
m_x264_param_t.b_cabac = 0;
m_x264_param_t.analyse.i_trellis = 0;
m_x264_param_t.analyse.b_chroma_me = 1;
m_x264_param_t.rc.i_qp_min = 10;//20;
m_x264_param_t.rc.i_qp_max = 32;
m_x264_param_t.rc.i_qp_step = 4;
m_x264_param_t.rc.f_ip_factor = 1.4;
m_x264_param_t.rc.f_pb_factor = 1.3;
m_x264_param_t.rc.f_qcompress = 1.0;
m_x264_param_t.rc.i_bitrate = 0;
m_x264_param_t.rc.i_rc_method = X264_RC_CQP;
m_x264_param_t.i_bframe = 2;
m_x264_param_t.analyse.b_weighted_bipred = 0;
m_x264_param_t.b_bframe_pyramid = 0;
m_x264_param_t.b_bframe_adaptive = 0;
m_x264_param_t.analyse.b_bidir_me = 0;
m_x264_param_t.i_bframe_bias = 0;
m_x264_param_t.analyse.i_subpel_refine = 3;
m_x264_param_t.analyse.i_me_method = X264_ME_DIA;//X264_ME_HEX?X264_ME_DIA
m_x264_param_t.analyse.i_me_range = 16;
m_x264_param_t.analyse.i_direct_mv_pred = X264_DIRECT_PRED_TEMPORAL;
m_x264_param_t.i_deblocking_filter_alphac0 = 0;
m_x264_param_t.i_deblocking_filter_beta = 0;
m_x264_param_t.analyse.intra = X264_ANALYSE_I4x4;// 帧内预测模式
m_x264_param_t.analyse.inter = X264_ANALYSE_I4x4 | X264_ANALYSE_PSUB16x16 | X264_ANALYSE_BSUB16x16; // 帧间预测模式
m_x264_param_t.analyse.b_transform_8x8 = 1;
m_x264_param_t.vui.i_sar_width = 0;
m_x264_param_t.vui.i_sar_height = 0;
m_px264_t = x264_encoder_open( &m_x264_param_t );
memset( &m_x264Picture_t, 0, sizeof( x264_picture_t ) );
x264_picture_alloc( &m_x264Picture_t, m_x264_param_t.i_csp, m_x264_param_t.i_width, m_x264_param_t.i_height );
if (m_px264_t == NULL)
return false;
return true;
编码代码如下:
BOOL CMyX264Encode::X264Encode(BYTE* pInData, int nLen, BYTE* pOutBuf, int& nOutLen, int& nKeyFrame)
{
if(nLen != m_x264_param_t.i_width * m_x264_param_t.i_height * 3/2)
{
return FALSE;
}
m_x264_param_t.i_frame_total ++;
//memset(&m_x264Picture_t,0x00,sizeof(x264_picture_t));
memcpy(m_x264Picture_t.img.plane[0], pInData, m_x264_param_t.i_width * m_x264_param_t.i_height);
memcpy(m_x264Picture_t.img.plane[1], pInData + m_x264_param_t.i_width * m_x264_param_t.i_height, m_x264_param_t.i_width * m_x264_param_t.i_height / 4);
memcpy(m_x264Picture_t.img.plane[2], pInData + m_x264_param_t.i_width * m_x264_param_t.i_height * 5 / 4, m_x264_param_t.i_width * m_x264_param_t.i_height / 4);
m_x264Picture_t.i_pts = (int64_t)m_x264_param_t.i_frame_total * m_x264_param_t.i_fps_den;
x264_picture_t pic_out;
x264_nal_t *nal = NULL;
int i_nal = 0;
if( &m_x264Picture_t )
{
m_x264Picture_t.i_type = X264_TYPE_AUTO;
m_x264Picture_t.i_qpplus1 = 0;
}
//TraceTime("x264_encoder_encode begin");
if( x264_encoder_encode( m_px264_t, &nal, &i_nal, &m_x264Picture_t, &pic_out ) < 0 )
{
return FALSE;
}
//TraceTime("x264_encoder_encode end");
nOutLen = 0;
int nOutCanUse;// = DATA_MAX;
for( int i = 0; i < i_nal; i++ )
{
int i_size = 0;
nOutCanUse = DATA_MAX;
if( ( i_size = x264_nal_encode( pOutBuf + nOutLen, &nOutCanUse, 1, &nal[i] ) ) > 0 )
{
nOutLen += i_size;
//nOutCanUse -= i_size;
}
}
nKeyFrame = pic_out.i_type==X264_TYPE_IDR;// || (pic_out.i_type==X264_TYPE_I && coCfg->x264_max_ref_frames==1);
return TRUE;
}