2014-10-04 90 views
3

您可以在Android上使用MediaPlayer或SoundPool播放聲音。 使用MediaPlayer時,我們的兩款Android設備播放的聲音會大得多。 在第三個設備上,音量聽起來相同。Android:爲什麼MediaPlayer比SoundPool播放的聲音更響亮?

你知道爲什麼嗎? 我可以讓SoundPool像MediaPlayer那樣響亮地播放聲音嗎?

設備的問題:

  • 平板LG-V400(Android 4.4的奇巧)

  • 電話​​(安卓4.2.2)

代碼:播放MP3聲音的Soundpool

private void playSoundPool() { 
    int MAX_STREAMS = 2; 
    SoundPool soundPool = new SoundPool(MAX_STREAMS, AudioManager.STREAM_MUSIC, 0); 
    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
     @Override 
     public void onLoadComplete(SoundPool soundPool, int soundId, int status) { 
      int loop = 0; 
      int priority = 0; 
      float rate = 1.f; 
      soundPool.play(soundId, 1, 1, priority, loop, rate);      
     } 
    }); 
    soundPool.load(this, R.raw.test, 1); 
} 

代碼:播放MP3聲音的MediaPlayer

private void playMediaPlayer() { 
    MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.test); 
    mediaPlayer.setVolume(1, 1); 
    mediaPlayer.start(); 
} 

歡迎您download test project

+0

將'1.0f'作爲'soundPool.play'的音量時會發生什麼?我想你會想要使用相同的音量水平,如果你想要相同的音量。 – ianhanniballake 2014-10-04 06:00:06

+0

這是一樣的。我已將0.99f放入,因爲有人在2010年建議將SoundPool音量保持在[0,0.99f]範圍內。我用「1」更新了代碼,以保持簡單。 – Pavel 2014-10-04 06:05:22

+0

也許它與MediaPlayer.setAudioStreamType有關? – pskink 2014-10-04 06:17:46

回答

0

可能的解決方案:

您需要創建AudioManager用於獲取,改變手機用戶設置了全球媒體的體積和通過的Soundpool改變流量分別爲改變我們自己的應用程序的音量。

AudioManager mgr = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); 

int streamVolume = mgr.getStreamVolume(AudioManager.STREAM_MUSIC); 

streamVolume = streamVolume/AudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 

mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f); 

注:

如果我設置0.5的量的Soundpool,實際成交量將是永遠的全球一個一半。很容易重現:在活動

  • 設定全球媒體容積手機設置到最大
  • 設定的音量使用soundpool.play 0.5 - 播放聲音的Soundpool
  • 設定的音量播放到1 - 播放聲音,這將是兩次 大聲

因此,傳遞給SoundPool.play方法的音量真的是全球音量的倍數! **因此,如果您想在當前音量設置下播放聲音,只需傳遞「1」作爲音量或根據要求更改它即可**

可能是使用全局媒體音量播放音頻的媒體播放器類文件。您正在使用硬編碼的soundPool.play(soundId,,,priority,loop,rate);價值!

我們需要嘗試

MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.test); 
mediaPlayer.setVolume(streamVolume,streamVolume); 
mediaPlayer.start(); 

一些更多的文本:

的Soundpool:

的Soundpool設計爲可以保存在內存中 短片解壓爲快速訪問,這非常適合應用程序或遊戲中的音效。在音板中使用這種方法是一個不好的想法,因爲您會將大量「中等」大小的聲音加載到 內存中,並且您可能會超出限制(16Mb)並得到一個 OutOfMemoryException。 SoundPool使用單獨的線程加載音樂文件 ,主線程的操作不會阻塞UI。 它可以用於播放短時間的聲音片段,比如在一場比賽中(比如長度小於3秒)的 。 聲音庫附帶的一個很好的功能是,您可以同時播放很多聲音 當您想到遊戲時會發生很多事情。因此,您首先創建一個 Sound Pool對象來加載所有媒體文件。 MediaPlayer的:」

的MediaPlayer是專爲較長的聲音文件或流,這是 最適合的音樂文件或更大的文件的文件被加載從磁盤每次創建被稱爲 ,這將節省內存空間。 但引入了小延遲(並不很明顯)

價:SO

+0

我不明白解決方案,對不起。 – Pavel 2014-10-07 18:37:54

-1

機制也是有差別的,因爲你可以說,由於壓縮和decompressi音質和音量可能會低於實際音量,並與MediaPlayer進行比較。所以最好在您的情況下使用MediaPlayer以獲得更好的音質和音量。

的Soundpool

的Soundpool設計爲可以保存在內存中解壓縮,以便快速訪問短片,這是最適合的應用或遊戲的聲音效果。在soundboard中使用這種方法是一個糟糕的主意,因爲您會將大量「中等」大小的聲音加載到內存中,並且您可能會超出限制(16Mb)併發生OutOfMemoryException。

MediaPlayer的

的MediaPlayer是專爲較長的聲音文件或流,這是最適合的音樂文件或更大的文件。每次創建被調用時,這些文件都將從磁盤加載,這將節省內存空間,但會引入一個小延遲(不是很明顯)。

+0

SoundPool在我們的應用程序中用於兩個原因。 1.無縫聲音循環 - MediaPlayer不是能夠發揮真正無間斷的循環,總是有明顯的突破 2.由於你提到的原因 - 許多小型音效需要快速播放 爲什麼你認爲SoundPool使用壓縮/解壓縮和MediaPlayer沒有「 t? – Pavel 2014-10-27 09:21:04

+0

您是否嘗試過使用SoudPool播放聲音:AudioManager audioManager =(AudioManager)getSystemService(Context.AUDIO_SERVICE); audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.getStreamMaxVolume(),0); – Hamad 2014-10-27 09:44:52

+0

另請參見的Soundpool還有其他問題! http://stackoverflow.com/questions/7266298/android-sound-api-deterministic-low-latency – Hamad 2014-10-27 09:47:12

相關問題