G726標準庫與海思G726庫資料轉換

byxdaz發表於2017-04-04

一、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

相關文章