gpt4 book ai didi

android - 在左右扬声器上播放 2 个不同的音频流

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:59:54 27 4
gpt4 key购买 nike

一些特殊的情况逼着我去做那变态的事情。

是否可以在不同的 channel 上播放 2 个不同的音频流。想象一下耳机,我需要同时在左扬声器和右扬声器上播放第一首歌曲和第二首歌曲。

经过一些研究,我发现可以在某个单一 channel 播放。甚至可以关闭其中之一。但我没有找到任何有关如何同时播放 2 个音频流的信息。

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


研究结果。

1) AudioTrack 可以在不同 channel 播放

// 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 个流并设置一个 0 左音量和 100 右音量,反之亦然第二个流。对吧?

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)

也许有使用 MediaPlayer 的解决方案,这样会更可取!


解决方案:似乎最简单的解决方案是使用 SoundPool。我测试它的方式。

//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();
}
}

尽管缺少 MediaPlayer.OnCompletionListener() 等功能。现在确定如何实现这个但无论如何.. 问题解决了。

最佳答案

任何一种方法 1) 2) 都应该像您所说的那样工作。

关于方法 1),如果你想同时播放不同的流,你可以在同一个循环中写入具有不同数据的两个 channel ,而无需使用两个循环。 为了设置每个 channel 的音量,您可以使用AudioTrack 的方法setStereoVolume(float leftGain, float rightGain) .

因为 MediaPlayer 是一个高级 API,所以它不提供这种级别的特异性;一种解决方法是将音频数据保存到一个文件(使左/右声道静音)并使用 MediaPlayer 作为常规媒体元素播放


更新:

save the audio data to a file (muting the left/right channel)

要做到这一点,假设您的音频数据是 AudioTrack 兼容格式 (PCM),您只需要按照您所说的那样处理数据(通过重置数组的一部分使一个 channel 静音)然后保存数组/buffer 到 WAV/PCM 文件。看看here有关如何保存 WAV 文件的更多详细信息和代码。

关于android - 在左右扬声器上播放 2 个不同的音频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31703976/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com