當前位置:編程學習大全網 - 源碼下載 - Android音頻播放

Android音頻播放

最近需要在Android的客戶端中使用PCM聲音播放和錄制,簡單學習了壹下。有不正確的地方還請指出。

首先有幾個概念需要了解壹下:采樣頻率、聲道數、采樣位數。

采樣頻率壹般是sample rate, 代表的是數字化音頻時每秒采樣的次數。常見的有44.1KHz(CD品質)、48KHz等。

這個很好理解,單聲道Mono就是聲音從壹個方向傳出來;雙聲道Stereo也叫立體聲,聲音是從兩個方向傳來。通常的流行音樂中,仔細聽能發現每個聲道可能側重不同的樂曲聲部,比如左聲道吉他,右聲道鋼琴,人聲似乎兩個聲道都有,聽起來就像站在中間壹樣。(這裏沒有考證,隨便舉例)

每壹個采樣都是壹個數據點,采樣位數是指這個數據點使用了幾位來記錄。AudioTrack類只支持8位和16位的PCM音頻。8位就是2的8次方,即256個值;而16位則是2的16次方,有65536個值。

這個在音頻的編解碼中還是比較常用的。在PCM格式中,1秒鐘音頻的數據大小是SampleRate×Channel×Bit/8,單位是byte字節。由於PCM本身沒有音頻幀的概念,所以通過這個公式就能計算出任意時長音頻的大小,或者得到任意大小音頻的時長。如果規定1個音頻幀是“每個聲道256個采樣”,雙聲道下就是512個采樣,那麽1幀的數據量就是256×Channel×Bit/8,同理可以推斷出1秒鐘有多少音頻幀等等。音頻幀的概念在各種編解碼中各有不同,但計算公式大同小異,這裏不展開。

Android中音頻的播放使用的是AudioTrack類,具體用法非常簡單。

首先設置buffer大小。AudioTrack播放時需要先寫入buffer,如果這個buffer沒有寫滿,那麽這部分是不會播放的。所以buffer不能設置太小,這樣會導致播放不連貫;而buffer也不能設置太小,這樣不間斷寫入會消耗許多CPU資源。AudioTrack自帶了getMinBufferSize方法可以給出壹個最小buffer,壹般用這個值就可以。getMinBufferSize方法三個參數分別是sample rate、channel和bit。

設置完buffer size就可以實例化壹個AudioTrack。其中第壹個參數streamType是指不同的音頻流類型,包括STREAM_MUSIC、STREAM_ALARM、STREAM_VOICE_CALL、STREAM_RING等,是Android對不同音頻的分類。中間三個參數很好理解,第四個是buffer size,剛剛計算出來了。最後壹個參數mode有兩種:MODE_STREAM和MODE_STATIC。前者是以流形式播放,後者則是壹次性全部寫入然後播放。

調用實例的play()方法就可以開始播放了。不過播放得要有數據吧?要填寫數據就要用到write()方法。write方法中第壹個參數是壹個byte[]類型,是要寫入的數據源,可以是從文件流中讀取出來的;第二個參數offset是初始位移,即從source的哪個位置開始;第三個參數則是輸入長度。

當write方法寫滿壹個AudioTrack的buffer時,就會有聲音播放出來了。

當播放完成後記得要把AudioTrack停止並釋放。

  • 上一篇:女生說牛牛是什麽意思?
  • 下一篇:路由器是幹嘛用的?
  • copyright 2024編程學習大全網