iOS G711編碼

G.711是一種由國際電信聯(lián)盟(ITU-T)制定的音頻編碼方式焦除,又稱為ITU-T G.711凳谦。
它是國際電信聯(lián)盟ITU-T定制出來的一套語音壓縮標(biāo)準(zhǔn)鸠踪,它代表了對數(shù)PCM(logarithmic pulse-code modulation)抽樣標(biāo)準(zhǔn)媒楼,主要用于電話掀宋。它主要用脈沖編碼調(diào)制對音頻采樣天梧,采樣率為8k每秒盔性。它利用一個 64Kbps 未壓縮通道傳輸語音訊號。 起壓縮率為1:2呢岗, 即把16位數(shù)據(jù)壓縮成8位冕香。G.711是主流的波形聲音編解碼器。

G.711 標(biāo)準(zhǔn)下主要有兩種壓縮算法后豫。
一種是μ-law algorithm (又稱often u-law, ulaw, mu-law)悉尾,主要運用于北美和日本;
另一種是A-law algorithm挫酿,主要運用于歐洲和世界其他地區(qū)构眯。其中,后者是特別設(shè)計用來方便計算機(jī)處理的早龟。


G711A(A-LAW)壓縮算法

(1)取符號位并取反得到s
(2)獲取強(qiáng)度位eee惫霸,獲取方法如圖所示
(3)獲取高位樣本位wxyz
(4)組合為seeewxyz猫缭,將seeewxyz逢偶數(shù)為取補(bǔ)數(shù),編碼完畢

a-law強(qiáng)度位對照表
例:

輸入pcm數(shù)據(jù)為1234它褪,二進(jìn)制對應(yīng)為(0000 0100 1101 0010)
二進(jìn)制變換下排列組合方式(0 00001 0011 010010)
(1)獲取符號位最高位為0饵骨,取反,s=1
(2)獲取強(qiáng)度位00001茫打,查表居触,編碼制應(yīng)該是eee=011
(3)獲取高位樣本wxyz=0011
(4)組合為10110011,逢偶數(shù)為取反為11100110
編碼完畢老赤。


G711U(U-LAW)壓縮算法

通過查表轮洋,計算出:基礎(chǔ)值+平均偏移值

u-law
例:

輸入pcm數(shù)據(jù)為1234
(1)取得范圍值,查表得+2014 to +991 in 16 intervals of 64
(2)得到基礎(chǔ)值為0xA0
(3)得到間隔數(shù)為64
(4)得到區(qū)間基本值2014
(5)當(dāng)前值1234和區(qū)間基本值差異2014-1234=780
(6)偏移值=780/間隔數(shù)=780/64抬旺,取整得到12
(7)輸出為0xA0+12=0xAC
編碼完畢弊予。


code如下
#import <Foundation/Foundation.h>

@interface EncoderG711 : NSObject

- (unsigned char)linear2alaw:(int)pcm_val;
- (unsigned char)linear2ulaw:(int)pcm_val;

@end
#import "EncoderG711.h"

#define QUANT_MASK (0xf)
#define SEG_SHIFT (4)
#define BIAS (0x84)

@implementation EncoderG711

static short seg_end[8] = {0xFF,0x1FF,0x3FF,0x7FF,0xFFF,0x1FFF,0x3FFF,0x7FFF};

static int search(int val,short *table,int size)
{
    int i;
    for (i = 0; i < size; i++) {
        if (val <= *table++)
            return (i);
    }
    return (size);
}

- (unsigned char)linear2alaw:(int)pcm_val
{
    int mask;
    int seg;
    unsigned char aval;
    if (pcm_val >= 0) {
        mask = 0xD5;
    } else {
        mask = 0x55;
        pcm_val = -pcm_val - 8;
    }
    seg = search(pcm_val, seg_end, 8);
    if (seg >= 8)
        return (0x7F ^ mask);
    else {
        aval = seg << SEG_SHIFT;
        if (seg < 2)
            aval |= (pcm_val >> 4) & QUANT_MASK;
        else
            aval |= (pcm_val >> (seg + 3)) & QUANT_MASK;
        return (aval ^ mask);
    }
}

- (unsigned char)linear2ulaw:(int)pcm_val
{
    int mask;
    int seg;
    unsigned char uval;
    if (pcm_val < 0) {
        pcm_val = BIAS - pcm_val;
        mask = 0x7F;
    } else {
        pcm_val += BIAS;
        mask = 0xFF;
    }
    seg = search(pcm_val, seg_end, 8);
    if (seg >= 8)
        return (0x7F ^ mask);
    else {
        uval = (seg << 4) | ((pcm_val >> (seg + 3)) & 0xF);
        return (uval ^ mask);
    }
}

@end
- (NSData *)encodeG711:(NSData *)data {
    NSUInteger datalength = [data length];
    Byte *byteData = (Byte *)[data bytes];
    short *pPcm = (short *)byteData;
    free(byteData);
    int outlen = 0;
    int len =(int)datalength/2;
    Byte *G711Buff = (Byte *)malloc(len);
    memset(G711Buff,0,len);
    int i;
    for (i=0; i<len; i++) {
        if (_type==G711A) {
            G711Buff[i] = [_g711 linear2alaw:pPcm[i]];
        }
        else if (_type==G711U) {
            G711Buff[i] = [_g711 linear2ulaw:pPcm[i]];
        }
    }
    outlen = i;
    Byte *sendbuff = (Byte *)G711Buff;
    NSData *sendData = [[NSData alloc] initWithBytes:sendbuff length:len];
    free(G711Buff);
    return sendData;
}

G711A/G711U解碼請參考這篇:iOS G711解碼

語音對講Demo:https://github.com/XuningZhai/TalkDemo_G711_AAC

參考:https://blog.csdn.net/szfhy/article/details/52448906

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市开财,隨后出現(xiàn)的幾起案子汉柒,更是在濱河造成了極大的恐慌,老刑警劉巖责鳍,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碾褂,死亡現(xiàn)場離奇詭異,居然都是意外死亡历葛,警方通過查閱死者的電腦和手機(jī)正塌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恤溶,“玉大人乓诽,你說我怎么就攤上這事≈涑蹋” “怎么了鸠天?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長帐姻。 經(jīng)常有香客問我粮宛,道長,這世上最難降的妖魔是什么卖宠? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮忧饭,結(jié)果婚禮上扛伍,老公的妹妹穿的比我還像新娘。我一直安慰自己词裤,他們只是感情好刺洒,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布鳖宾。 她就那樣靜靜地躺著,像睡著了一般逆航。 火紅的嫁衣襯著肌膚如雪鼎文。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天因俐,我揣著相機(jī)與錄音拇惋,去河邊找鬼。 笑死抹剩,一個胖子當(dāng)著我的面吹牛撑帖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澳眷,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼胡嘿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钳踊?” 一聲冷哼從身側(cè)響起衷敌,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拓瞪,沒想到半個月后缴罗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡吴藻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年瞒爬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沟堡。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡侧但,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出航罗,到底是詐尸還是另有隱情禀横,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布粥血,位于F島的核電站柏锄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏复亏。R本人自食惡果不足惜趾娃,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缔御。 院中可真熱鬧抬闷,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炕泳,卻和暖如春纵诞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背培遵。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工浙芙, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荤懂。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓茁裙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親节仿。 傳聞我的和親對象是個殘疾皇子晤锥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • ### YUV顏色空間 視頻是由一幀一幀的數(shù)據(jù)連接而成,而一幀視頻數(shù)據(jù)其實就是一張圖片廊宪。 yuv是一種圖片儲存格式...
    天使君閱讀 3,270評論 0 4
  • 前言 說到視頻箭启,大家自己腦子里基本都會想起電影壕翩、電視劇、在線視頻等等傅寡,也會想起一些視頻格式 AVI放妈、MP4、RMV...
    ForestSen閱讀 22,869評論 10 202
  • 在保證視頻圖像質(zhì)量的前提下荐操,HEVC通過增加一定的計算復(fù)雜度芜抒,可以實現(xiàn)碼流在H.264/AVC的基礎(chǔ)上降低50%。...
    加劉景長閱讀 7,839評論 0 6
  • 今天Scratch講解好像效果還不錯托启,學(xué)習(xí)科學(xué)有點迷迷糊糊的宅倒。導(dǎo)師問題依舊糾結(jié),還好有高人指點屯耸,真是欣慰拐迁。繼續(xù)努力...
    dq920813閱讀 212評論 0 0
  • 【敬畏】-【體驗】-【持續(xù)】-【交給】-【顯現(xiàn)】 1、缺啥補(bǔ)啥疗绣,怕啥練啥 2线召、一切為我所用,所用為團(tuán)隊 3多矮、我要變...
    魏晉凱閱讀 49評論 0 0