2012-01-08 337 views
5

首先,我需要生成2個正弦波音調,它們具有相同的頻率,但相位相反,並在Android上以立體聲模式分別播放到左右聲道。播放需要完全同步,以便左右聲道的正弦被「鏡像」(當左聲道具有時,例如右聲道的採樣值120應該具有-120)。如何分別使用AudioTrack播放左右聲道?

事情是,我還沒有找到任何證據表明這種設置將如何工作。是否有可能將兩個單獨的音調/樣本緩衝區分別供給AudioTrack以分別同時在左右聲道中回放?如果不是的話,任何其他解決方案,以達到最終結果非常讚賞。

我猜想一個選擇是使用預先生成的立體聲波形文件並將其與AudioTrack進行流式處理,但這對於作品中的解決方案似乎太不靈活。同時,如果AudioTrack能夠以「真實」立體聲模式播放這些預先錄製的音頻文件,我希望對於生成的聲音也可能有同樣的效果。

+2

感謝android開發者用戶組中的niko20:「你不需要一個單獨的緩衝區左右立體聲立體聲音頻是 交錯輸出立體聲你只需左右填充緩衝區 左右」。這實際上運行良好,用AudioTrack進行測試 – rar 2012-01-10 21:51:53

回答

0

好吧,這可能工作,因爲只有兩個樣本。

首先檢查SoundPool出。如果您的軌道在完全加載到內存中時需要良好的性能,它非常有用。然而,這有其缺點,主要的缺點是存儲器中存儲的軌道大小受到限制。當我第一次使用這個時,我試着把2個4Mb的文件放到一個流中 - 這不是一個好主意。

的Soundpool具有這樣的功能:

setVolume(int streamID, float leftVolume, float rightVolume) 

注意如何設置的音量,左右爲每個流?對於流1,您可以使用最大音量,然後對音頻流2使用最大音量。

我會根據需要設置流播放文件和音量,然後播放它們。

簡明教程可以在http://www.vogella.de/articles/AndroidMedia/article.html

+0

好吧,我理解你的意思,但是SoundPool很不幸,對我的幫助不大,因爲我需要在我的代碼中生成聲音,並使用AudioTrack和MODE_STREAM爲了即時提供播放緩衝區。 AudioTrack支持CHANNEL_OUT_MONO和CHANNEL_OUT_STEREO配置,但是我沒有找到一個選項來實際將不同的代碼生成的聲音提供給左右聲道。 – rar 2012-01-09 11:36:36

5

AudioTrack中找到具有相同的方法的Soundpool。它叫

AudioTrack.setStereoVolume();

如果你想在同一時間使用不同的數據打左/右聲道。您應該處理數據以達到此目標。如果您選擇帶有16Bit PCM的立體聲模式,則左側爲一個字節,右側爲一個字節。例如:

左聲道想玩:12,23,34,45

右聲道想玩:54,43,32,21同時與左聲道。

數據應生成爲:{12,54,23,43,34,32,45,21}

然後,使用AudioTrack.write(數據)。它將完美滿足你的目標。

+0

這是正確的嗎?我必須將每個通道的一個元素沿輸出緩衝區交換嗎? – 2014-04-14 23:05:37

+0

我正在嘗試爲單聲道音頻做單聲道,但我發現它現在由public int setVolume(float gain)完成在API級別21中添加在此軌道的所有聲道上設置指定的輸出增益值。這個API比setStereoVolume(float,float)更受歡迎,因爲它可以更加優雅地縮小到單聲道,並且可以達到超過立體聲的多聲道內容。那麼我現在怎麼控制它呢? – VMMF 2016-04-28 03:22:18