做很久的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. 对于手机观看基本上看清,没有明显的马賽克。