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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值