G726标准库与海思G726库数据转换

mac2024-06-28  49

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

———————————————— 版权声明:本文为博主「byxdaz」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/byxdaz/article/details/69218739

最新回复(0)