https://blog.csdn.net/byxdaz/article/details/69218739
一、G726标准库与海思G726库数据转换原理。
使用标准G726编解码库(比如:ffempeg)将PCM数据转换成G726数据,只有G726裸数据。如果使用海思G726编解码库(比如:hisi_voice_engine)将PCM数据转换成G726数据,有G726裸数据+4个字节的海思私有头。
标准G726库编解码数据与海思G726库编解码数据之间相互转换。
原始数据
目标数据
转换过程
标准G726库编码数据
海思G726库编码数据
在标准的编码数据基础上加上4个字节海思私有头。用海思G726解码时需要使用MEDIA_G726_XXX格式。
海思G726库编码数据
标准G726库编码数据
在海思G726库编码数据基础上去掉4个字节海思私有头。
海思G726音频帧说明如下,前面2个short表示海思私有头。short表示2个字节。
参数(单位short)
位
说明
short 0
15:8
Frame Flag
01B : normal voice frame
other: invalid
7:0
reseverd
short 1
15:8
Frame Counter
7:0
Raw Frame Data Length
short 2
15:0
Raw data 0
short 3
15:0
Raw data 1
short
15:0
…
short 2+n
15:0
Raw data n
海思的编解码代码中,对于g726的码率选择有两套,一套遵循RFC3551,另外一套说是for ASF.
G726_16K = 0, /* G726 16kbps, see RFC3551.txt 4.5.4 G726-16 */
G726_24K, /* G726 24kbps, see RFC3551.txt 4.5.4 G726-24 */
G726_32K, /* G726 32kbps, see RFC3551.txt 4.5.4 G726-32 */
G726_40K, /* G726 40kbps, see RFC3551.txt 4.5.4 G726-40 */
MEDIA_G726_16K, /* G726 16kbps for ASF ... */
MEDIA_G726_24K, /* G726 24kbps for ASF ... */
MEDIA_G726_32K, /* G726 32kbps for ASF ... */
MEDIA_G726_40K, /* G726 40kbps for ASF ... */
两种类型码率互解会有问题,三星、海康的IPC使用ASF类型,解码时解码器采用的码率类型的不同而造成解码有问题。
ffmpeg g726解码时,如果海思g726码流类型为asf时,请选择AV_CODEC_ID_ADPCM_G726解码器类型;如果海思g726码流类型为RFC3551标准时,请选择AV_CODEC_ID_ADPCM_G726LE解码器类型。
如果获取码流类型?
int type = 0;//码率类型
switch((lSourceDataLength-4)/20)// lSourceDataLength为音频数据长度(包含了4个字节海思头),比如104
{
case 2:
type = G726_16KBPS;
break;
case 3:
type = G726_24KBPS;
break;
case 4:
type = G726_32KBPS;
break;
case 5:
type = G726_40KBPS;
break;
default:
type = G726_40KBPS;
}
//g726的码率选择有两套,遵循for ASF时,使用MEDIA_G726_XXX。
二、项目应用场景
对讲应用,前端电脑PC采集PCM数据,将数据进行G726编码(使用海思G726编解码库)压缩,传输数据到对讲机设备上,对讲机设备接收数据,进行G726解码(使用ffmpeg标准库),输出PCM数据到音频模块,实现电脑与对讲机之间的对讲。
假设前端电脑PC采集PCM数据,PCM数据格式为:8k采样率,位宽2字节,单声道。
使用20ms的PCM数据打成一包,打成一包之后数据大小为320字节。通过G726 40KBPS码率编码成G726音频数据,编码之后的G726原始音频数据大概是100字节,再加上4个字节的海思私有头,共104个字节。
因为电脑这边对G726编码时使用的是海思G726编解码库,海思G726编解码库在G726原始音频数据前加了4个字节海思私有头,所以使用标准编解码库(g726、ffempeg等)解码时要减少4个字节海思私有头。
对讲机这边对G726编码时使用的是标准编解码库,而电脑这边解码时使用的海思G726编解码库,所以要在标准编解码库编码的基础上增加4个字节海思私有头,形成海思的编码格式数据,从而被海思G726编解码库解码。
关于多少数据打成一帧数据,一般是20~50毫秒采集原始数据打包成一帧。
三、编码/解码代码
//------------------------------------------------------------
//功能: 编码
//参数: pSourceData:原始数据 lSourceDataLength:数据长度
// pOutputData:编码后数据 npOutLength:编码后数据长度
//返回: 错误代码
//------------------------------------------------------------
intHisiAudioEncode(unsigned char* pSourceData,long lSourceDataLength,unsigned char* pOutputData,int* npOutLength)
{
HI_S32 s32Rel = HI_VOICE_EncodeFrame((HI_VOID*)m_pEncoder,(HI_S16*)pSourceData,(HI_S16*)pOutputData,(HI_S16)lSourceDataLength/sizeof(HI_S16));//海思编码函数
if (HI_SUCCESS != s32Rel)
return EncoderFDefine::E_EncoderF_ErrorCode_Unknow;
//码流数据加上海思帧结构头(4个字节长度)
*npOutLength = (pOutputData[2])*sizeof(HI_S16) + 4;
return EncoderFDefine::E_EncoderF_ErrorCode_Succeed;
}
//------------------------------------------------------------
//功能: 解码
//参数: pSourceData:G726音频数据 lSourceDataLength: G726音频数据长度
// pOutputData: 解码后数据 npOutLength: 解码后数据长度
//返回: 错误代码
//------------------------------------------------------------
intHisiAudioDecode(unsigned char* pSourceData,long lSourceDataLength,unsigned char* pOutputData,int* npOutLength)
{
int type = 0;//码率类型
switch((lSourceDataLength -4)/20) // lSourceDataLength为音频数据长度(包含了4个字节海思头),比如104
{
case 2:
type = G726_16KBPS;
break;
case 3:
type = G726_24KBPS;
break;
case 4:
type = G726_32KBPS;
break;
case 5:
type = G726_40KBPS;
break;
default:
type = G726_40KBPS;
}
//g726的码率选择有两套,遵循for ASF时,使用MEDIA_G726_XXX。
DecoderInit(type); //解码初始化 ,类型变化时重新初始化
HI_S16 len = lSourceDataLength;
int nRet = HI_VOICE_DecodeFrame((HI_VOID*)m_pDecoder,(HI_S16*) pSourceData, (HI_S16*) pOutputData, &(HI_S16)len);
* npOutLength = len*2;
}
四、g726编解码参考资料
ffmpeg中G726解码器用法与编码器用法
http://blog.csdn.net/chinabinlang/article/details/27513981
G726源码
http://download.csdn.net/download/qingming52591/1449229
https://github.com/EasyDarwin/EasyAACEncoder
————————————————
版权声明:本文为CSDN博主「byxdaz」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/byxdaz/article/details/69218739