1. 程式人生 > >Android AudioRecord錄音音量大小

Android AudioRecord錄音音量大小

最近在做語音識別功能,在使用者錄音的時間要有個動畫標識錄音的音量

參考了

http://blog.csdn.net/greatpresident/article/details/38402147

發現每臺手機得出的結果不一至,而且得到的音量結果的梯度不明顯。

繼續度娘後找到更好的解決方案

http://ikinglai.blog.51cto.com/6220785/1256781/

錄音的編碼主要有兩種:8位pcm和16位pcm。8位pcm用一個位元組表示語音的一個點,16位pcm用兩個位元組,也就是一個short來表示語音的一個點。需要特別注意的是,如果你用的16位pcm編碼,而取錄音資料用的是byte的話,需要自己將兩個bye轉換成一個short。將兩個byte轉換成一個short,有小端和大端兩種,一般預設情況都是小端,但是有的開源庫,比如lamemp3需要的就是大端,這個要根據不同的情況進行不同的處理。

下面以Android為例,介紹一下用平均值計算音量的方法。

private double calculateVolume(short[] buffer){

       double sumVolume = 0.0;

       double avgVolume = 0.0;

       double volume = 0.0;

       for(short b : buffer){

               sumVolume += Math.abs(b);

       }

       avgVolume = sumVolume / buffer.length;

       volume = Math.log10(1 + avgVolume) * 10;

       return volume;

}

還有一個特別需要注意的問題是:如果你錄音的編碼是16為pcm,而錄音資料資料是byte,需要將兩個byte轉為一個short進行處理,建議用小端的方式。

private doublecalculateVolume(byte[] buffer){

       double sumVolume = 0.0;

       double avgVolume = 0.0;

       double volume = 0.0;

       for(int i = 0; i < buffer.length; i+=2){

               int

 v1 = buffer[i] & 0xFF;

               int v2 = buffer[i + 1] & 0xFF;

               int temp = v1 + (v2 << 8);// 小端

               if (temp >= 0x8000) {

                       temp = 0xffff - temp;

               }

       sumVolume += Math.abs(temp);

       }

       avgVolume = sumVolume / buffer.length / 2;

       volume = Math.log10(1 + avgVolume) * 10;

       return volume;

}