G726標準庫與海思G726庫資料轉換
一、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
相關文章
- Java與資料庫 —— JDBC標準Java資料庫JDBC
- 資料庫標準化與正規化資料庫
- Oracle標準資料庫稽核Oracle資料庫
- 資料庫轉換工具,不同資料庫之前任意轉換資料庫
- Profile標準化資料庫管理資料庫
- ORACLE資料庫標準審計Oracle資料庫
- 資料庫 - 關聯式資料庫標準語言SQL資料庫SQL
- 標準模板庫STL (轉)
- Python標準庫14 資料庫 (sqlite3)Python資料庫SQLite
- 謹慎做資料庫技術的標準化(轉)資料庫
- CUJ:標準庫:標準庫中的搜尋演算法 (轉)演算法
- 使用Profile標準化資料庫管理資料庫
- 【審計】標準資料庫審計資料庫
- 標準模板庫介紹(轉)
- Oracle資料庫標準版與企業版的區別Oracle資料庫
- 資料變換-歸一化與標準化
- Python 快速教程(標準庫14):資料庫 (sqlite3)Python資料庫SQLite
- ORACLE資料庫中SCN與時間的轉換Oracle資料庫
- STL 簡介,標準模板庫(轉)
- Oracle 資料庫安全許可權配置標準Oracle資料庫
- C 標準庫 -
- [轉]資料標準化
- C++標準庫簡介、與STL的關係【轉】C++
- 亞信安慧AntDB資料庫:引領資料庫標準與效能規範,推動行業創新資料庫行業
- RAC One Node資料庫的轉換與線上遷移資料庫
- iOS標準庫中常用資料結構和演算法之KV資料庫iOS資料結構演算法資料庫
- CUJ:標準庫:bitset和bit vector (轉)
- STL 簡介,標準模板庫[1] (轉)
- Oracle DG資料庫狀態轉換Oracle資料庫
- Oracle資料庫日期格式轉換操作Oracle資料庫
- Oracle資料庫遊標使用大全(轉)Oracle資料庫
- Tkinter (22) 標準化外觀及選項資料庫資料庫
- 國產資料庫適合搞國家標準嗎資料庫
- 基礎知識6——標準資料庫稽核——未完資料庫
- C++標準庫C++
- 標準庫之template
- CUJ:標準庫:容納指標的容器 (轉)指標
- clang與icc:標準庫排序效能對比排序