利用x264lib编码h264流的源码

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

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;
};
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 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;
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
stm32f10x_lib.h是STMicroelectronics公司开发的一款适用于STM32F10x系列单片机的C语言库文件,可以为开发者提供快速、方便的STM32F10x系列单片机开发环境。 在STM32F10x系列单片机的开发过程中,开发者需要进行外设驱动、中断处理、时钟控制、GPIO控制等方面的编程工作,而stm32f10x_lib.h是ST公司提供的完整的C语言库,包含有相应的函数接口,可以为开发者省去许多繁琐的编程工作,提高了开发效率。 具体来说,stm32f10x_lib.h可提供以下一系列功能: 1.各种外设的驱动函数,如USART、ADC、SPI、I2C等,可以方便地进行外设的初始化、发送与接收数据等操作; 2.支持DMA的数据传输,可以大大提高数据传输效率; 3.提供了丰富的中断处理函数,可方便地实现中断服务程序,并通过优先级设置和预定优先级处理多中断时的冲突; 4.提供定时器控制函数,支持定时器周期、占空比等参数的设置,可实现各种复杂的定时控制功能; 5.提供了简单的GPIO控制函数,可控制单片机I/O口的输入输出状态; 6.提供许多标准数学函数和字符串处理函数,方便开发者使用。 stm32f10x_lib.h的下载途径主要有以下几种: 1.在ST公司官网上下载,需要注册ST公司的账号,同时还需要选择具体的单片机型号和适合的软件版本。 2.在一些开发者社区和下载网站上下载,这些网站提供的不一定是最新的版本,而且有可能存在风险。 3.利用集成开发环境(IDE)自带的软件包管理工具进行下载,例如Keil、IAR、MCUXpresso等。 总的来说,stm32f10x_lib.h作为一款底层C语言库文件,可以实现对STM32F10x系列单片机相关外设的快速、简便的编程,能够大大减少开发难度,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值