音訊的編譯碼及其優化方法和經驗

2021-08-20 13:37:00 字數 2472 閱讀 2902

音訊的編譯碼(codec)根據應用場景的不同主要由幾大技術組織制定,分別是itu-t、3gpp、mpeg。當然也有一些公司或者公司的聯合體等制定,如微軟的wma。他們不僅制定了codec的規範,同時還提供軟體實現的reference code,這樣便於普及制定的codec的使用。本文先談談這些codec,然後講怎麼樣根據reference code去優化codec(主要是減少cpu load)。

1,codec 規範

1)itu-t

itu-t制定的是有線語音的codec標準,即g系列,主要有g.711、g.722、g.726、g.728、g.729等。取樣率窄帶是8khz,寬頻是16khz。位元速率從64kbps到8kbps不等。下表列出了具體的取樣率和位元速率。

3gpp制定的是移動語音的codec標準,主要是amr(adaptive multi-rate,自適應多位元速率)系列等,能根據網路狀況自適應的調整位元速率。取樣率窄帶是8khz,寬頻是16khz。近年來為了應對網際網路的競爭(網際網路公司提出了涵蓋語音和**的opus codec),3gpp出台了evs(enhanced voice service)音訊編譯碼規範。evs也涵蓋了語音和**,能在兩者之間靈活切換,支援多種取樣率和位元速率。具體如下表。

mpeg制定的主要是**的編譯碼規範,主要有***、aac等。***大家都很熟悉,是近二十年來聽**的最主要的格式,aac是***的繼承者,下一代的最主要的**編譯碼規範。**中取樣率一般是44100hz,也有的用48000hz。位元速率在乙個範圍內,位元速率越大,音質越好。

4)公司或公司聯合體

我用過的codec從語音到**分別有g.711/g.722/g.726/g.728/g.729/amr-nb/amr-wb/ilbc/opus/***/aac/wma/ape/vorbis/alac/flac等。

2,codec的優化

這裡講的優化主要是指cpu load的優化,即優化後執行codec占用更少的cpu,在具體的硬體平台上執行的更流暢。優化到什麼程度算結束這依賴需求而定。如果優化後給所在專案用,就要看專案給你多長時間優化以及專案能接受的優化後的cpu load,一般情況下專案用上優化後的codec後在最複雜的場景下能流暢執行又不影響其他功能就可以了,因為專案上要騰出人手做其他事情,畢竟專案進度和質量是最重要的。如果優化後作為庫賣給客戶用,就要盡量優化到極致,因為這是使用者選擇用哪家公司庫的重要指標,是賣點,這種情況下就會有更多的優化方法和技巧。我做過的優化都是給專案用,沒有作為庫給客戶用,因而技巧不是特別多。

1)優化前的準備工作

a)    通讀一下要優化的codec的**,盡量讀懂,即使沒懂也要搞清楚函式是幹什麼的,這有利於後面優化。

b)    準備好profiling工具,profiling工具就是測量執行某個函式花了多少clock。有現成的profiling工具最好,如果沒有就根據具體os和硬體平台(arm/mips等)自己做工具。

c)    準備好test vector,即測試的音源,一般codec制定的官方會提供,通常是多個vector, 對應於不同的場景。優化的原則是在減少cpu load的同時演算法運算結果不被改變,所以在做優化時每優化一些就要用test vector跑一下,看結果有沒有改變,如果改變了,就要退回到上乙個版本。我做優化時每天至少保留乙個版本,有時兩個或者三個,就是為了出問題時好回溯,盡快查出哪個地方的優化出了問題。

2)優化步驟與方法

a)    將編譯器的優化選項從-o0改為-o3

b)    給**中那些經常被呼叫的又短小的函式加上inline

通常情況下做完a,b後load會下來一大截,如同擠泡沫一樣,會擠掉很大一部分。

c)     itu-t或者3gpp的codec reference code中有好多基本運算(加減乘除)的函式,這些函式都寫的特別嚴謹,同時呼叫的頻次又非常高,因而加大了運算複雜度。這些函式中有些在保證正確的前提下可以簡化(如一些防飽和就可以不要),這樣處理後load會降下來一些。

d)    用profiling工具一步步排檢視到底哪個函式花的load多,明白這個函式是幹什麼的,然後具體問題具體分析,看怎麼樣來優化。

e)    有些函式就是乙個小演算法,reference code中寫的比較複雜,呼叫頻次又比較高。要去找有沒有簡單的實現可以替代,有的話替代了load就會降下來一些。比如codec中經常有求平方根的計算,reference code中通常寫的比較複雜。我們知道用牛頓迭代法也可以求平方根,就可以用牛頓迭代法去替換將load降下來。

f)     用彙編優化。如果在c級別能解決問題就不要用彙編了。各個處理器都有自己的彙編指令集,需要去學並且掌握其中的思想和技巧。通常是用的頻次較高的又比較佔load的函式用彙編去寫,即用c和彙編混合程式設計。彙編優化花的時間會相對長一些。

當然還有一些小的技巧比如展開for迴圈、用指標替代陣列等,這裡就不一一說了。

音訊的編譯碼及其優化方法和經驗

音訊的編譯碼 codec 根據應用場景的不同主要由幾大技術組織制定,分別是itu t 3gpp mpeg。當然也有一些公司或者公司的聯合體等制定,如微軟的wma。他們不僅制定了codec的規範,同時還提供軟體實現的reference code,這樣便於普及制定的codec的使用。本文先談談這些cod...

Android音訊開發(5) 音訊資料的編譯碼

1.android 官方的 mediacodec api 首先,我們了解一下 android 官方提供的音訊編譯碼的 api,即 mediacodec 類,該 api 是在 andorid 4.1 api 16 版本引入的,因此只能工作於 android 4.1 以上的手機上。樂搏學院 1.1 me...

Android音訊開發(5) 音訊資料的編譯碼

1.android 官方的 mediacodec api 首先,我們了解一下 android 官方提供的音訊編譯碼的 api,即 mediacodec 類,該 api 是在 andorid 4.1 api 16 版本引入的,因此只能工作於 android 4.1 以上的手機上。1.1 mediaco...