在左右扬声器上播放2个不同的audiostream

有些特殊的情况迫使我去做那个变态的事情。

是否有可能在不同的频道播放2个不同的audiostream。 想象一下头戴式耳机,我需要同时播放左扬声器的第一首歌曲和右扬声器的第二首歌曲。

经过一番研究,我发现有可能在某个单一频道上播放。 甚至有可能closures其中一个。 但我没有find任何信息如何同时播放2个audiostream。

这甚至有可能吗? 如何? 一些代码示例和链接表示赞赏!


研究成果。

1) AudioTrack能够在不同的频道上播放

 // only play sound on left for(int i = 0; i < count; i += 2){ short sample = (short)(Math.sin(2 * Math.PI * i / (44100.0 / freqHz)) * 0x7FFF); samples[i + 0] = sample; samples[i + 1] = 0; } // only play sound on right for(int i = 0; i < count; i += 2){ short sample = (short)(Math.sin(2 * Math.PI * i / (44100.0 / freqHz)) * 0x7FFF); samples[i + 0] = 0; samples[i + 1] = sample; } 

2) SoundPool可以分别设置左右声道的音量。 所以从技术上讲,可以开始2个audiostream,并设置一个左侧的音量,右侧的音量设置为100,第二个stream的音量也可以相反。 对?

 setVolume(int streamID, float leftVolume, float rightVolume) 

样品:

  SoundPool pool = new SoundPool(1, AudioManager.STREAM_NOTIFICATION, 0); pool.play( pool.load(this, R.raw.my_sound_effect, 1), // The sound effect to play 0, // The volume for the left channel (0.0 - 1.0) 1.0f, // The volume for the right channel (0.0 - 1.0) 0, // Default priority 0, // Do not loop 1.0f); // Playback rate (1.0f == normal) 

Perhabs使用MediaPlayer有这样的解决scheme,所以这将是更好的!


解决scheme :似乎最简单的解决scheme是使用SoundPool 。 我testing的方式。

 //SDK Version public CustomSoundPool() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { AudioAttributes attributes = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_GAME) .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .build(); soundPool = new SoundPool.Builder() .setAudioAttributes(attributes) .build(); } else { soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); } soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { @Override public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { soundPool.play(sampleId, 1.0f, 0, 0, 0, 1.0f); //left channel //soundPool.play(sampleId, 0, 1.0f, 0, 0, 1.0f); //right channel } }); } public void playSound(String path) { if (soundPool != null) { soundPool.load(path, 1); } } public void release(){ if (soundPool != null) { soundPool.release(); } } 

虽然缺less像MediaPlayer.OnCompletionListener()这样的function。 现在确定如何实现这个,但无论如何..问题解决了。

Solutions Collecting From Web of "在左右扬声器上播放2个不同的audiostream"

无论哪种方法1)2)应该像你所说的那样工作。

关于方法1),如果您想同时播放不同的数据stream,则可以在同一个循环中使用不同数据写入两个通道,而不使用两个循环。 为了设置每个通道的音量 ,可以使用AudioTrack的方法setStereoVolume(float leftGain, float rightGain)

由于MediaPlayer是高级API,因此不提供这种级别的特定性; 解决方法是将audio数据保存到文件(使左/右声道静音),并使用MediaPlayer作为常规媒体元素进行MediaPlayer


更新:

将audio数据保存到文件(静音左/右声道)

为此,假设您的AudioTrack兼容格式(PCM)中有您的audio数据,您只需按照您所说的处理数据(通过重置数组的一部分来静音一个通道),然后将数组/缓冲区保存为一个文件为WAV / PCM。 在这里看看有关如何保存WAV文件的更多细节和代码。