音頻處理—SOX音效

音頻處理

目前軟件開發中所做的音頻處理主要包括:

  • 音頻編解碼
  • 3A(回聲消除AEC,降噪ANC,增益AGC)
  • 混響,均衡器,壓縮器等

對於音頻編解碼,使用成熟的編解碼開源庫即可。對於3A算法,基本上借鑑webRTC上的3A算法擴展即可。
但是對於混響,均衡器,壓縮器等音效處理確是沒有一種明確的處理方案,目前已知的比較靠譜的開源庫就是(SOX,openAL)

SOX介紹

SOX:一款自稱是音頻處理界的瑞士軍刀的一款開源庫,SoX - Sound eXchange。SOX可以直接安裝到PC上執行命令,用於各種格式的轉換,播放,以及給音頻加入特效。也可以通過交叉編譯在移動端運行。

該軟件的主頁是http://sox.sourceforge.net/

這兩篇文章裏面可以看到SOX的能力介紹:SOX能力介紹SoX使用手冊

SOX API使用

在使用SOX庫之前,必須初始化整個庫的全局參數,需要調用:

    sox_init();

上述函數返回一個整數,如果返回的是SOX_SUCCESS這個枚舉值,代碼初始化成功;

退出SOX則需要調用如下代碼

    sox_quit();

需要注意的是,如果沒有調用sox_quit方法,那麼不可以再一次調用sox_init,否則會Crash。

接下來初始化輸入文件,代碼如下:

sox_format_t* in;
const char* in_path = "/sdcard/input.wav";
in = sox_open_read(in_path,NULL,NULL,NULL);

再來初始化輸出文件,代碼如下:

sox_format_t* out;
const char* out_path = "/sdcard/output.wav";
out = sox_open_write(out_path,&in->signal,NULL,NULL,NULL,NULL);

sox使用類似責任鏈設計模式的方式設計整個系統,所以使用時需要先構造一下效果器鏈,然後將使用的效果器一個一個加到這個效果鏈中。先來構造這個效果器鏈,代碼如下:

sox_effects_chain_t* chain;
chain = sox_create_chain(&in->encoding , &out->encoding);

上述代碼構造出了一個效果器鏈,重要的是裏面的兩個參數,這兩個參數實際上就是確定輸入,輸出的數據格式,比如聲道數,採樣率,位寬等。這些數據已經從初始化sox_format_t的時候拿到了,會存進相應encoding屬性中,有了效果器鏈,就可以構建效果器,然後添加進效果器鏈。

先來構建一下輸入數據的效果器:(所有支持的效果器可以去effects.h這個頭文件中查看)

sox_effect_t* inputEffect;
inputEffect = sox_create_cffect(sox_find_effect("input"));

上述代碼構造了一個輸入數據的效果器,但是數據從哪來呢,怎麼將上面的輸入文件配置到這個效果器中呢,代碼如下:

char* args[10];
args[0] = (char*)in;
sox_effect_options(inputEffect,1,args) //參數含義:效果器,參數個數,具體參數

目前已經給inputEffect效果器配置好了需要的參數,然後要將這個效果器增加到效果器鏈中,並將這個效果器釋放掉,代碼如下:

sox_add_effect(chain,inputEffect,&in->signal,&in->signal);
free(inputEffect);

到此已經把這個輸入效果器添加到了效果器鏈中,接下來在加入一個增加音量的效果器,添加代碼如下:

sox_effect_t*  volumeEffect;
volumeEffect = sox_create_cffect(sox_find_effect("vol"));
args[0] = "20db";
sox_effect_options(volumeEffect,1,args) ;
sox_add_effect(chain,volumeEffect,&in->signal,&in->signal);
free(volumeEffect);

到此一個增加20db增加音量效果器添加完成。

接下來添加一個輸出數據的效果器,代碼如下:

sox_effect_t*  outputEffect;
outputEffect = sox_create_cffect(sox_find_effect("output"));
args[0] = (char*)out;
sox_effect_options(outputEffect,1,args) ;
sox_add_effect(chain,outputEffect,&in->signal,&in->signal);
free(outputEffect);

到此這個效果器鏈構建完好了:
input.wav—>inputEffect------>volumeEffect------->outputEffect------>output.wav
要讓效果器鏈運行起來,要執行如下代碼:

sox_flow_effects(chain,NULL,NULL);

這個方法執行結束,整個處理流程就結束了,增加音量後的音頻數據已經全部被寫入output.wav。
處理完後就要銷燬這個效果器鏈了:

sox_delete_effects_chain(chain);
sox_close(out);
sox_close(in);
sox_quit();

到此結束。當然輸入,輸出也可以是data音頻數據。修改輸入,輸出效果器即可實現實時處理。

混響器的實現

這裏就不在解釋混響是什麼了,可以自行搜索。。。
混響音效重要的時配置參數 需要懂樂理進行參數調節,可調節出KTV,溫暖,磁性,空靈,悠遠,3D迷幻,等音效,當然和均衡器一起使用效果更好。

sox_effect_t* reverb;
reverb = sox_create_effect(sox_find_effect("reverb"));

//是否純溼聲
char* wetOnle = "-w";
//混響大小,高頻阻尼,房間大小
char* reverbrance = "50";
char* hfDamping = "50";
char* roomScale = "80";
//立體聲深度,早反射聲,及溼聲增益,代碼如下:
char* stereoDepth = "90";
char* preDelay = "30";
char* wetGain = "0";

char* args = {wetOnle,reverbrance,hfDamping,roomScale,stereoDepth,preDelay,wetGain};
sox_effect_options(reverb,7,args);

將這個效果器添加進效果器鏈中,運行程序,可得出一個有音效的輸出文件。

均衡器的實現

sox_effect_t* eq;
eq = sox_create_effect(sox_find_effect("equalizer"));
//中心頻率,頻寬,增益
char* frequency = "400";
char* bandWidth = "1.25q";
char* gain = "4db";

char* args = {frequency,bandWidth,gain};
sox_effect_options(eq,3,args);

一般情況下會創建多個均衡器作用到用一音頻上。處理音頻的時候一般還會加上高通,低通。效果器名稱分別是highpass,lowpass。
壓縮器等其他效果器就不在示範了,和上面這些套路基本一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章