有问题或者想法,大家交流下哈,没有人评论,都没有继续下去的动力了。。。直接给出代码吧:
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 short m_usHeight;
- };
- #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 set
- unsigned short usWidth = atoi(argv[2]);
- unsigned short usHeight = atoi(argv[3]);
- //create X264 instance
- x264enc* 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);
- //realse
- delete []p_In_Frame;
- delete []p_Out_Frame;
- pX264enc->ReleaseConnection();
- fclose(ifp);
- fclose(ofp);
- return 0;
- }
本文提供了一个x264编码器的使用示例,包括如何初始化编码器、进行编码操作以及释放资源等步骤。通过具体的C++代码实现了从文件读取原始帧数据并将其编码为H.264格式。
586

被折叠的 条评论
为什么被折叠?



