音訊編碼 speex庫的使用方法

2021-10-04 21:48:55 字數 2829 閱讀 2466

一:編碼流程

使用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)來來關閉和銷毀speexbits和解碼器。

二:解碼流程

同樣,對已經編碼過的音訊資料進行解碼要經過以下步驟:

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和解碼器。

下面是一段例項**:

下面是一段例項**:

#include

#include

/幀的大小在這個例程中是乙個固定的值,但它並不是必須這樣/

#define frame_size 160

int main(int argc, char **ar**)

char *infile;

file *fin;

short in[frame_size];

float input[frame_size];

char cbits[200];

int nbbytes;

/儲存編碼的狀態/

void *state;

/儲存位元組因此他們可以被speex常規讀寫/

speexbits bits;

int i, tmp;

//新建乙個新的編碼狀態在窄寬(narrowband)模式下

state = speex_encoder_init(&speex_nb_mode);

//設定質量為8(15kbps)

tmp=8;

speex_encoder_ctl(state, speex_set_quality, &tmp);

infile = ar**[1];

fin = fopen(infile, 「r」);

//初始化結構使他們儲存資料

speex_bits_init(&bits);

while (1)

//讀入一幀16bits的聲音

fread(in, sizeof(short), frame_size, fin);

if (feof(fin))

break;

//把16bits的值轉化為float,以便speex庫可以在上面工作

for (i=0;iinput[i]=in[i];

//清空這個結構體裡所有的位元組,以便我們可以編碼乙個新的幀

speex_bits_reset(&bits);

//對幀進行編碼

speex_encode(state, input, &bits);

//把bits拷貝到乙個利用寫出的char型陣列

nbbytes = speex_bits_write(&bits, cbits, 200);

//首先寫出幀的大小,這是sampledec檔案需要的乙個值,但是你的應用程式中可能不一樣

fwrite(&nbbytes, sizeof(int), 1, stdout);

//寫出壓縮後的陣列

fwrite(cbits, 1, nbbytes, stdout);

//釋放編碼器狀態量

speex_encoder_destroy(state);

//釋放bit_packing結構

speex_bits_destroy(&bits);

fclose(fin);

return 0;

音訊剪輯軟體的使用方法分享?

工具介紹 作業系統 支援win vista win7 win8 win10 剪輯 軟體 是一款高效實用的音訊剪輯工具,不僅能夠剪輯 軟體還提供了不同格式的音訊轉換,音訊合併,音量調整,雜訊消除,內建多種錄音等功能。剪輯 具體步驟 1.開啟安裝好軟體,在剪輯介面,點選 新增檔案 按鈕,在彈出的檔案對話...

json c 庫的使用方法

引入json c的庫 json c的讀寫操作 讀json c json object pobj null pobj json object from file bob.json 讀檔案裡的資料 pval json object object get jobj,sname type json obje...

BeautifulSoup庫的使用方法

from bs4 import beautifulsoup import lxml html the dormouse s story once upon a time there were three little sisters and their names were elsie,lacie ...