• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            音頻編解碼-speex庫的使用方法

            轉載自:http://www.rosoo.net/a/201010/10363.html

            Speex是近年來開發出的一套功能強大的語音引擎,能夠實現高質量和低比特率的編碼。它不僅提供了基于碼激勵線性預測(CELP)算法的編/解碼模塊, 而且在其最新發布的版本中還提供了聲音預處理和聲學回聲消除模塊,為保障IP網絡中的語音通信質量提供了技術手段。此外,Speex還具有壓縮后的比特率 低(2~44 kbps)的特點,并支持多種比特率。這些特點使得Speex特別適合VoIP的系統。

            雖然是開源的,但是使用的人還不是很多,網上的資料也很少,下面簡單給大家介紹一下如何使用speex的API。

             

            一:編碼流程
            使用Speex的API函數對音頻數據進行壓縮編碼要經過如下步驟:
            1、定義一個SpeexBits類型變量bits和一個Speex編碼器狀態變量enc_state。
            2、調用speex_bits_init(&bits)初始化bits。
            3、調用speex_encoder_init(&speex_nb_mode)來初始化enc_state。其中speex_nb_mode是SpeexMode類型的變量,表示的是窄帶模式。還有speex_wb_mode表示寬帶模式、speex_uwb_mode表示超寬帶模式。
            4、調用函數int speex_encoder_ ctl(void *state, int request, void *ptr)來設定編碼器的參數,其中參數state表示編碼器的狀態;參數request表示要定義的參數類型,如SPEEX_ GET_ FRAME_SIZE表示設置幀大小,SPEEX_ SET_QUALITY表示量化大小,這決定了編碼的質量;參數ptr表示要設定的值。
            可通過speex_encoder_ctl(enc_state, SPEEX_GET_FRAME_SIZE, &frame_size) 和speex_encoder_ctl(enc_state, SPEEX_SET_QUALITY, &quality)來設定編碼器的參數。
            5、初始化完畢后,對每一幀聲音作如下處理:調用函數speex_bits_reset(&bits)再次設定SpeexBits,然后調用函數speex_encode(enc_state, input_frame, &bits),參數bits中保存編碼后的數據流。
            6、編碼結束后,調用函數speex_bits_destroy (&bits),    speex_encoder_destroy (enc_state)來
            二:解碼流程
            同樣,對已經編碼過的音頻數據進行解碼要經過以下步驟:
            1、     定義一個SpeexBits類型變量bits和一個Speex編碼狀態變量enc_state。
            2、   調用speex_bits_init(&bits)初始化bits。
            3、   調用speex_decoder_init (&speex_nb_mode)來初始化enc_state。
            4、    調用函數speex_decoder_ctl (void *state, int request, void *ptr)來設定編碼器的參數。
            5、   調用函數 speex_decode(void *state, SpeexBits *bits, float *out)對參數bits中的音頻數據進行解編碼,參數out中保存解碼后的數據流。
            6、   調用函數speex_bits_destroy(&bits), speex_ decoder_ destroy (void *state)來關閉和銷毀SpeexBits和解碼器。
             
            下面是一段實例代碼:
            1. #include <speex.h> 
            2. #include <stdio.h> 
            3. /*幀的大小在這個例程中是一個固定的值,但它并不是必須這樣*/ 
            4. #define FRAME_SIZE 160 
            5.   
            6. int main(int argc, char **argv) 
            7. char *inFile; 
            8. FILE *fin; 
            9. short in[FRAME_SIZE]; 
            10. float input[FRAME_SIZE]; 
            11. char cbits[200]; 
            12. int nbBytes; 
            13. /*保存編碼的狀態*/ 
            14. void *state; 
            15. /*保存字節因此他們可以被speex常規讀寫*/ 
            16. SpeexBits bits; 
            17. int i, tmp; 
            18. //新建一個新的編碼狀態在窄寬(narrowband)模式下 
            19. state = speex_encoder_init(&speex_nb_mode); 
            20. //設置質量為8(15kbps) 
            21. tmp=8; 
            22. speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp); 
            23. inFile = argv[1]; 
            24.   
            25. fin = fopen(inFile, "r"); 
            26. //初始化結構使他們保存數據 
            27. speex_bits_init(&bits); 
            28. while (1) 
            29. //讀入一幀16bits的聲音 
            30. fread(in, sizeof(short), FRAME_SIZE, fin); 
            31. if (feof(fin)) 
            32. break
            33. //把16bits的值轉化為float,以便speex庫可以在上面工作 
            34. for (i=0;i<FRAME_SIZE;i++) 
            35. input[i]=in[i]; 
            36.  
            37. //清空這個結構體里所有的字節,以便我們可以編碼一個新的幀 
            38. speex_bits_reset(&bits); 
            39. //對幀進行編碼 
            40. speex_encode(state, input, &bits); 
            41. //把bits拷貝到一個利用寫出的char型數組 
            42. nbBytes = speex_bits_write(&bits, cbits, 200); 
            43. //首先寫出幀的大小,這是sampledec文件需要的一個值,但是你的應用程序中可能不一樣 
            44. fwrite(&nbBytes, sizeof(int), 1, stdout); 
            45. //寫出壓縮后的數組 
            46. fwrite(cbits, 1, nbBytes, stdout); 
            47.   
            48. //釋放編碼器狀態量 
            49. speex_encoder_destroy(state); 
            50. //釋放bit_packing結構 
            51. speex_bits_destroy(&bits); 
            52. fclose(fin); 
            53. return 0; 

             

            posted on 2012-11-22 01:27 楊粼波 閱讀(3667) 評論(0)  編輯 收藏 引用 所屬分類: 文章收藏

            亚洲伊人久久精品影院| 亚洲精品国产第一综合99久久| 久久精品国产福利国产琪琪 | 欧美黑人激情性久久| 日日狠狠久久偷偷色综合96蜜桃| 青青草原综合久久| 亚洲精品高清国产一久久| 99久久无码一区人妻a黑| 国产V综合V亚洲欧美久久| 国产精品美女久久久久久2018| 综合人妻久久一区二区精品| 亚洲AV无码成人网站久久精品大| 伊人久久大香线蕉综合影院首页| 久久综合香蕉国产蜜臀AV| 久久人爽人人爽人人片AV| 99久久久国产精品免费无卡顿 | 久久影视综合亚洲| 亚洲色欲久久久久综合网| 国内精品综合久久久40p| 久久天天躁狠狠躁夜夜网站 | 99久久99久久精品国产| 久久嫩草影院免费看夜色| 久久久久国产精品人妻| 久久久久亚洲av无码专区导航| 国产精品久久久久9999高清| 99久久亚洲综合精品网站| 青青草原综合久久大伊人导航| 狠狠色丁香久久婷婷综合| 精品少妇人妻av无码久久| 精品久久综合1区2区3区激情| 久久精品极品盛宴观看| 色欲av伊人久久大香线蕉影院| 免费观看久久精彩视频| 欧美日韩精品久久免费| 久久99精品国产麻豆宅宅| 免费一级欧美大片久久网 | 久久精品一区二区国产| 国产69精品久久久久观看软件| 国内精品久久久久影院免费| 性欧美大战久久久久久久| 精品免费tv久久久久久久|