利用x264lib编码h264流的源码

来源:互联网 发布:怎么做淘宝客 编辑:程序博客网 时间:2024/06/08 01:27

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

x264enc.h:

#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 shortm_usHeight;};
x264enc.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_AUTOVARIANCE*/;param.rc.f_aq_strength = 0.3f;param.i_log_level = X264_LOG_NONE;h = x264_encoder_open(¶m);if(h == NULL){return false;}m_usWidth=usWidth;m_usHeight=usHeight;return true;}static int encode_nals(unsigned char *buf, x264_nal_t *nals, int nnal){    unsigned char *p = buf;    int i;    for(i = 0; i < nnal; i++){int nsize = 0;        int s = x264_nal_encode(p, &nsize, 1, nals + i);        if(s < 0)            return -1;        p += s;    }    return p - buf;}bool x264enc::X264Encode(unsigned char* pInFrame,const int& nInLen,unsigned char* pOutFrame,int& nOutLen,bool& bKeyFrame){x264_nal_t *nal;x264_picture_t pic_out;x264_picture_t pic;int nnal = 0;if(pInFrame){pic.img.i_csp = X264_CSP_I420;pic.img.i_plane = 3;pic.img.plane[0] = pInFrame;pic.img.plane[1] = pInFrame + m_usWidth*m_usHeight;pic.img.plane[2] = pic.img.plane[1] + (m_usWidth*m_usHeight / 4);pic.img.i_stride[0] = m_usWidth;pic.img.i_stride[1] = m_usWidth / 2;pic.img.i_stride[2] = m_usWidth / 2;pic.i_type = X264_TYPE_AUTO;if(x264_encoder_encode(h, &nal, &nnal, &pic, &pic_out) < 0){return false;}}else{if(x264_encoder_encode(h, &nal, &nnal, NULL, &pic_out) < 0){return false;}}if(nnal <= 0)return false;    nOutLen = encode_nals(pOutFrame, nal, nnal);    if(nOutLen < 0){        return false;}    if(pic_out.i_type == X264_TYPE_IDR){bKeyFrame = true;}else{bKeyFrame = false;}return true;}void x264enc::ReleaseConnection(){if(h){x264_encoder_close(h);h = NULL;}delete this;}

main.cpp:

#include "stdafx.h"#include <stdlib.h>#include "x264enc.h"int main(int argc, char* argv[]){if (argc != 5){printf("please input: Enc_Demo.exe filename1[input] Width Height filename2[output]\n");}//params setunsigned short usWidth = atoi(argv[2]);unsigned short usHeight = atoi(argv[3]);//create X264 instancex264enc* pX264enc = new x264enc;if(!pX264enc || !pX264enc->InitX264Encoder(usWidth, usHeight, 100, 5, 26)){pX264enc->ReleaseConnection();delete pX264enc;return -1;}unsigned char *p_In_Frame = new unsigned char[usWidth * usHeight * 3/2];unsigned char *p_Out_Frame = new unsigned char[usWidth * usHeight * 3/2];FILE* ifp = fopen(argv[1],"rb");FILE* ofp = fopen(argv[4],"wb");bool b_continue = true;int nReadUnit = usWidth * usHeight * 3/2;while (b_continue || !feof(ifp)){int n_OutFrame_Size  = 0;bool bKeyFrame = false;int nCount = fread(p_In_Frame, 1, nReadUnit, ifp);if(nCount != nReadUnit){b_continue = false;break;}unsigned char *pSrc = p_In_Frame;if(pX264enc->X264Encode(pSrc, nCount, p_Out_Frame, n_OutFrame_Size,bKeyFrame)){fwrite(p_Out_Frame, n_OutFrame_Size, 1, ofp);}}do{int n_OutFrame_Size = 0;bool b_KeyFrame = false;if(pX264enc->X264Encode(NULL, 0, p_Out_Frame, n_OutFrame_Size, b_KeyFrame)){fwrite(p_Out_Frame, n_OutFrame_Size, 1, ofp);}else{break;}}while(1);//realsedelete []p_In_Frame;delete []p_Out_Frame;pX264enc->ReleaseConnection();fclose(ifp);fclose(ofp);return 0;}

原创粉丝点击