利用x264lib编码h264流的源码(一)

2014-11-24 11:43:26 · 作者: · 浏览: 3

有问题或者想法,大家交流下哈,没有人评论,都没有继续下去的动力了。。。直接给出代码吧:

x264enc.h:

[cpp]
#pragma once
#include "inttypes.h"
extern "C"
{
#include "x264.h"
};

class x264enc
{
public:
x264enc(void);
virtual ~x264enc(void);
public:
bool InitX264Encoder(unsigned short usWidth,unsigned short usHeight,int nKeyFrameInterval,int nFrameRate,int nQuality);
bool X264Encode(unsigned char* pInFrame,const int& nInLen,unsigned char* pOutFrame,int& nOutLen,bool& bKeyFrame);
void ReleaseConnection();
private:
x264_t *h;

unsigned short m_usWidth;
unsigned short m_usHeight;
};
x264enc.cpp:
[cpp]
#include "StdAfx.h"
#include "x264enc.h"

x264enc::x264enc(void)
: h(NULL)
, m_usWidth(0)
, m_usHeight(0)
{
}

x264enc::~x264enc(void)
{
}

bool x264enc::InitX264Encoder(unsigned short usWidth,unsigned short usHeight,int nKeyFrameInterval,int nFrameRate,int nQuality)
{
x264_param_t param;
x264_param_default( m);

// param.i_width = usWidth;
// param.i_height = usHeight;
// param.b_deblocking_filter = 1;
// param.i_deblocking_filter_alphac0 = 1;//add
// param.i_deblocking_filter_beta = 1;//add
// param.b_cabac = 1;
//
// param.i_frame_reference = 1;//add
// param.i_bframe = 0;//add

// param.i_keyint_max = 6;//add
// param.i_keyint_min = 5;//add
//
// param.analyse.inter = X264_ANALYSE_I4x4|X264_ANALYSE_I8x8|X264_ANALYSE_PSUB16x16|X264_ANALYSE_BSUB16x16;
// param.analyse.intra = X264_ANALYSE_I4x4|X264_ANALYSE_I8x8;
// if((param.analyse.inter | param.analyse.intra) & X264_ANALYSE_I8x8)
// {
// param.analyse.b_transform_8x8=1;
// }
//
// param.rc.i_bitrate=/*900*/320;
// // param.rc.i_vbv_max_bitrate = (int)(320 * 1.04);//add
// // param.rc.i_vbv_buffer_size = 320;//add
//
// param.rc.i_qp_min=/*2*/6;
// param.rc.i_qp_max=/*31*/33;
// param.rc.f_qcompress=/*0.5f*/0.6f;
// param.rc.i_qp_constant=/*0*/17;
// param.rc.i_rc_method = X264_RC_CRF;
// param.rc.f_rf_constant = /*8.5f*/17;
// param.rc.i_aq_mode = X264_AQ_GLOBAL;
// param.rc.f_aq_strength = 0.3f;
// param.analyse.i_me_method = /*X264_ME_HEX*/X264_ME_UMH;
// param.analyse.i_subpel_refine = 7;//add
// param.analyse.b_mixed_references = 1;//add
// param.analyse.i_trellis = 1;//add
// param.analyse.b_weighted_bipred = 0;//add
// param.analyse.i_me_range = 6;//add
// param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_AUTO;//add
//
// param.i_log_level = X264_LOG_NONE;

param.i_width = usWidth;
param.i_height = usHeight;
param.b_deblocking_filter = 1;
param.b_cabac = 1;
param.analyse.inter = X264_ANALYSE_I4x4|X264_ANALYSE_I8x8|X264_ANALYSE_PSUB16x16|X264_ANALYSE_BSUB16x16;
param.analyse.intra = X264_ANALYSE_I4x4|X264_ANALYSE_I8x8;
if((param.analyse.inter | param.analyse.intra) & X264_ANALYSE_I8x8)
{
param.analyse.b_transform_8x8=1;
}
param.analyse.i_subpel_refine = 5;
param.analyse.i_me_method = X264_ME_HEX;

param.rc.i_bitrate=900;
param.rc.i_qp_min=2;
param.rc.i_qp_max=31;
param.rc.f_qcompress=0.5f;
param.rc.i_qp_constant=0;
param.rc.i_rc_method = X264_RC_CRF;
param.rc.f_rf_constant = 8.5f;
param.rc.i_aq_mode = X264_AQ_GLOBAL/*X264_AQ