一:編碼流程
使用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 ...