H.264编码器

做很久的H.264视频编码器支持从QCIF到1080P,想把它与大家分享。免费使用,有需要的可以发EMAIL给本人。

说明:


// 低码流H.264视频编码器
//
// author:abells 
// create date:2008-04-22
// modify date:2009-06-19
// EMAIL:abells2002@hotmail.com
// QQ : 244597635

// 使用方法:
// (1) 初始化编码器 InitializeParam(PARAM_INFO* pParam);
// (2) 反复编码一帧图像  EncodeFrame(unsigned char* pInputBuffer, PARAM_INFO* pParam, unsigned char* pOutBuf, int* pnOutLen, int* pnKeyFrame);
//  (3) 最后当不再需要时,释放编码器。ReleaseHandle(PARAM_INFO* pParam);
//
//  (4)对于同时编码多路视频时,重复(1)~(3)。对于多路不能使用同一个PARAM_INFO的参数

// CIF 352X288图像,在手机上 16帧/s, 64kb/s 仍能看图像而没有明显的马赛克
// 注:此库需要VC2005 或 VC2008编译

#ifndef PARAML264_H
#define PARAML264_H 1


#define INPUT_CSP_I420           0x0001  /* yuv 4:2:0 planar */
#define INPUT_CSP_YV12           0x0004  /* yuv 4:2:0 planar */

// 如果发现图像倒立,可以加上此项。如INPUT_CSP_I420 |INPUT_CSP_VFLIP
#define INPUT_CSP_VFLIP          0x1000  /* */

#define METHOD_NONE                   -1

// 恒定质量
#define METHOD_RC_CQP                  0

//基于质量自适应模式
#define METHOD_RC_CRF                  1

//可变、平均码流
#define METHOD_RC_ABR                  2


typedef struct
{
 // 图像宽 必需是16的倍数
    int nWidth;

 //图像高 必需是16的倍数
    int nHeight;

 //帧率
    int nFrameRate;

 //IDR长度,也是最大关键帧长度
 int nIDR;

 //源图像格式,只能是YUV420,即I420或YV12 (INPUT_CSP_I420或INPUT_CSP_YV12)
 int nIamgeType;

 // B帧数目.对于广播/点播流媒体,或录制压缩成电影文件时使用。对于实时视频会议不用,默认 = 0。
 int n_Bframe;

 //编码句柄
 int nEncodeHandle;

 // 编码方式 = METHOD_RC_CQP或METHOD_RC_CRF或METHOD_RC_ABR之一
 int n_rc_method;

 // 当n_rc_method = METHOD_RC_ABR,即平均码流下的平均码流与最大瞬间码流
    int nBitRate;//unit: KBit/s 如:120 表示码流为120kb/s


 // 最大差傎比例 |X|。一般 |x| = 5~80比较好,当然也可以>80
 int nMaxDelta;

 // // 当n_rc_method = METHOD_RC_CQP,给出恒定质量的量化QP(0-51),默认 = 28.
    int n_qp;

 // 图标倒立。默认:0。如果发现图标倒立,设置:1 可以把它翻转.
 int nLogReversal;
 
 //当n_rc_method = METHOD_RC_CRF 质量模式,量化值动态可变(0-51)
 float f_rf;

 //平均码率模式下,瞬时码率可以偏离的倍数,范围0.1~100.0,默认1.0
 float f_rate_tolerance;
   
} PARAM_INFO;


// 初始化编码器
// 编码成功返回0,失败返回-1
int InitializeParam(PARAM_INFO* pParam);

//释放编码器
void ReleaseHandle(PARAM_INFO* pParam);

//编码一帧图像, 支持160X120, QCIF以上图像。可以编码1080P以上视频,而不像一些公司的编码器连720P都不能编码。
// 参数:
// pInputBuffer:源YUV420图像的buffer
// pParam : InitializeParam函数后得到的参数
// bForcedToIDR: 是否强行把当前帧编码为IDR帧。当出现网络丢包时,可能要等到收到一下个IDR才能恢复图像 。此时可能根据需要把当前帧强行编码为IDR帧,bForcedToIDR = 0表示不强行。
// pOutBuf: 输出编码后的压缩图像buffer
// pnOutLen: 编码后的压缩图像buffer长度
// pnKeyFrame: 编码后的压缩图像是否是IDR帧
// 编码成功返回0,失败返回-1
int EncodeFrame(unsigned char* pInputBuffer, PARAM_INFO* pParam, int bForcedToIDR, unsigned char* pOutBuf, int* pnOutLen, int* pnKeyFrame);

 


#endif

///.c//
目前手机CDMA的上行大多数64~100 kb/s左右, 3.5G的EVDO 上行可以达到160~380 kb/s

测试结果(帧率:16帧/s):

对于64kb/s 低码流:实际结果的平均码流为64.86kb/s,瞬间最大码流 = 125.608. 对于手机观看基本上看清,没有明显的马賽克。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值