android手機的Mic對聲音的感知

來源:互聯網
上載者:User

  android提供可以實現錄音功能的有AudioRecord和MediaRecorder,其中AudioRecord是讀取Mic的音頻流,可以邊錄音邊分析流的資料;而MediaRecorder則能夠直接把Mic的資料存到檔案,並且能夠進行編碼(如AMR,MP3等)。

        首先,要將你的應用加入許可權(無論你是使用AudioRecord還是MediaRecorder):

                 <uses-permission android:name="android.permission.RECORD_AUDIO" />

        然後,分開介紹兩者的用法。

        《!--AudioRecord--》

        1、建立錄音採樣類,實現介面:

             public class MicSensor implements AudioRecord.OnRecordPositionUpdateListener

        2、關於AudioRecord的初始化:

             public AudioRecord (int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)

             audioSource:              錄音源(例如:MediaRecorder.AudioSource.MIC    指定Mic為錄音源)

             sampleRateInHz:        預設的採樣頻率,單位為Hz。(常用的如44100Hz、22050Hz、16000Hz、11025Hz、8000Hz,有人說44100Hz是目前保證在所有廠商的android手機上都能使用的採樣頻率,但是個人在三星i9000上使用卻不然,經測試8000Hz似乎更為靠譜)  

            channelConfig:           描述音頻通道設定。(在此我使用了AudioFormat.CHANNEL_CONFIGURATION_MONO)

            audioFormat:              音頻資料支援格式。(這個好像跟聲道有關,16bit的脈碼調製錄音應該是所謂的雙聲道,而8bit脈碼調製錄音是單聲道。AudioFormat.ENCODING_PCM_16BIT、AudioFormat.ENCODING_PCM_8BIT)

           bufferSizeInBytes:        在錄製過程中,音頻資料寫入緩衝區的總數(位元組)。 從緩衝區讀取的新音頻資料總會小於此值。 getMinBufferSize(int, int, int)返回AudioRecord 執行個體建立成功後的最小緩衝區。 設定的值比getMinBufferSize()還小則會導致初始化失敗。

       3、初始化成功後則可啟動錄音    audioRecord.startRecording()

       4、編寫線程類將錄音資料讀入緩衝區,進行分析

             short[] buffer = new short[bufferSize];              //short類型對應16bit音頻資料格式,byte類型對應於8bit
             audioRecord.read(buffer, 0, bufferSize);            //傳回值是個int類型的資料長度值

      5、在此需要對buffer中的資料進行一些說明:

           這樣讀取的資料是在時域下的資料,直接用於計算沒有任何實際意義。需要將時域下的資料轉化為頻域下的資料,才能訴諸於計算。

           頻域(frequency domain)是指在對函數或訊號進行分析時,分析其和頻率有關部份,而不是和時間有關的部份。

           函數或訊號可以透過一對數學的運運算元在時域及頻域之間轉換。例如傅裡葉變換可以將一個時域訊號轉換成在不同頻率下對應的振幅及相位,其頻譜就是時域訊號在頻域下的表現,而反傅裡葉變換可以將頻譜再轉換回時域的訊號。

           訊號在時域下的圖形可以顯示訊號如何隨著時間變化,而訊號在頻域下的圖形(一般稱為頻譜)可以顯示訊號分布在哪些頻率及其比例。頻域的標記法除了有各個頻率下的大小外,也會有各個頻率的相位,利用大小及相位的資訊可以將各頻率的弦波給予不同的大小及相位,相加以後可以還原成原始的訊號。

           經傅立葉變化後得到的複數數組是個二維數組,實部和虛部的平方和取對數後乘以10就大致等於我們通常表示音量的分貝了。

       《!--MediaRecorder--》

         相對於AudioRecord,MediaRecorder提供了更為簡單的api。

[java] view
plaincopy

  1.               mediaRecorder = new MediaRecorder();  
  2. mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);  
  3. mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  
  4. mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
  5. mediaRecorder.setOutputFile("/dev/null");    

         設定好mediaRecorder的各個屬性,然後通過線程調用方法  mediaRecorder.getMaxAmplitude();

            得到的是瞬時的最大振幅,直接取對數然後乘以10就可以表徵分貝了。

            最後需要說明一下,android手機廠商定製的硬體不盡相同,所以mic擷取的值也只能“表徵”,而不能拿過來當真正的依據。它們雖是智能手機,但也還是手機,機器人不是人!呵呵。。。

            對了,每個手機mic在聲訊號和電訊號進行轉換時都有做過電容保護,為了其不因外界環境的過於嘈雜而易受到損壞。所以超聲波和次聲波,我們人不容易接受的聲音,手機也不會入耳的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.