• <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久久精品一区二区| 久久精品国产亚洲AV不卡| 99久久这里只有精品| 狠狠精品久久久无码中文字幕 | 国内精品久久久久久野外| 国产亚洲美女精品久久久久狼| 51久久夜色精品国产| 久久国产AVJUST麻豆| 久久国产亚洲精品无码| 久久亚洲国产精品五月天婷| 亚洲精品tv久久久久久久久| 韩国三级中文字幕hd久久精品| 日产精品久久久久久久| 狠狠色丁香久久综合婷婷| 香港aa三级久久三级老师2021国产三级精品三级在 | 国内精品久久久久久久久电影网| 亚洲精品乱码久久久久久不卡| 久久精品天天中文字幕人妻| 久久精品夜色噜噜亚洲A∨| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 亚洲午夜福利精品久久| 国产精品女同久久久久电影院| 久久国产精品偷99| 久久国产精品99久久久久久老狼| 国产成人久久精品一区二区三区 | 久久99精品久久久久久久不卡 | 亚洲精品成人网久久久久久| 国产精品久久久久…| 看久久久久久a级毛片| 久久婷婷五月综合97色直播 | 久久久久人妻一区精品色| 久久久久久国产精品美女| 久久婷婷五月综合成人D啪| 国产毛片久久久久久国产毛片| av无码久久久久久不卡网站| 无码伊人66久久大杳蕉网站谷歌| 国产精品久久久久久久app| 久久久久久久久66精品片| 亚洲欧美久久久久9999| 伊人久久五月天| 久久精品国产亚洲AV忘忧草18|