Android游戲開發:游戲框架的搭建(2)


4.音頻模塊(Audio)

  音頻模塊編程從來都是一個復雜的話題。這里不打算用到一些高級復雜的音頻處理手段,主要是播放一些背景音樂。在書寫代碼前,讓我們了解一下音頻的基礎知識。

  采樣率:定義了每秒從連續信號中提取並組成離散信號的采樣個數,采樣率越高音質越好,單位用赫茲(Hz)來表示,CD一般是44.1KHz。對於每個采樣系統會分配一定存儲位(bit數)來表達聲波的聲波振幅狀態,稱之為采樣分辨率或采樣精度,每增加1個bit,表達聲波振幅的狀態數就翻一翻,並且增加6db的動態范圍態,1個2bit的數碼音頻系統表達千種狀態,即12db的動態范圍,以此類推。如16bit能夠表達65536種狀態,24bit可以表達多達16777216種狀態。動態范圍是指聲音從最弱到最強的變化范圍,人耳的聽覺范圍通常是20HZ~20KHZ。高的采樣率意味着更多的存儲空間。比如60s的聲音,采樣率8KHz、8bits,大約0.5M,采樣率44KHz、16bits,超過5M,普通的3分鍾的流行歌曲,將會超過15M。

  為了即不降低質量有不太占據空間,很多比較好的壓縮方法被提出來。比如MP3s 和OGGs格式就是網絡中比較流行的壓縮格式。

  可以看到3min的歌曲占了不少空間。當我們播放游戲的后台音樂時,我們可以把音頻流化而不是預先加載到內存。通常背景音樂只有一個,因此只需要到磁盤加載一次即可。

  對於一些短的音效,比如爆炸聲和槍的射擊聲,情況有所不同。這些短的音效經常會同時被調用多次,從磁盤對每個實例流化這些音效不是一個好的辦法。幸運的是,短的音效並不占用太多的內存空間,因此只需把這些音效提前讀入到內存即可,然后可以直接地同時播放這些音效。

  因此我們的代碼需要提供如下功能:

  我們需要一種方法加載音頻文件,用於流化播放(Music)和內存播放(Sound),同時提供控制播放功能。

  相應的接口有三個,Audio、Music和Sound,代碼如下。

  Audio接口Audio.java

package com.badlogic.androidgames.framework;

public interface Audio {
  public Music newMusic(String filename);
  public Sound newSound(String filename);
}

  Audio接口創建新的Music和 Sound實例。一個Music實例表示一個流音頻文件,一個Sound實例表示一個保存在內存中的短的音效。方法 Audio.newMusic()和Audio.newSound()都是以文件名作為參數並拋出IOException以防文件加載失敗(例如文件不存在或者文件損壞等情況)。

  Music接口Music.jva

package com.badlogic.androidgames.framework;

public interface Music {

  public void play();

  public void stop();

  public void pause();

  public void setLooping(boolean looping);

  public void setVolume(float volume);

  public boolean isPlaying();

  public boolean isStopped();

  public boolean isLooping();

  public void dispose();
}

  Music接口有點復雜,包含了播放音樂流、暫定和停止、循環播放、音量控制(從0到1的浮點數)方法。當然,里面還有一些getter方法,用來獲取當前音樂實例的狀態。當我們不再需要Music 實例時, 我們可以銷毀它(dispose方法),這會關閉系統資源,即流化的音頻文件。

 Sound接口Sound.java

package com.badlogic.androidgames.framework;

public interface Sound {

  public void play(float volume);

  public void dispose();

}

  Sound接口比較簡單,只包含play()和dispose()方法。前者以指定的音量為輸入參數,我們可以在任何我們需要的時候播放音效。后者在我們不許Sound實例時,我們需要銷毀它以釋放它占用的內存空間。

 

PS: 歡迎關注公眾號"Devin說",會不定期更新Java相關技術知識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM