安卓--多路同时流音频

7

我目前需要在Android设备上实现一个应用程序,可以打开实时音频流并将其播放给用户。这不是什么大问题,我已经成功地设置了一个流服务器,并使其对一个文件起作用。我的问题是,如何同时流和播放多个音频文件?

当我打开多个流(使用MediaPlayer)并准备和播放每个文件时,我只听到一个文件的音频。我不确定这目前是否可能,但我希望它是可能的。

我研究过使用SoundPool,但它似乎只适用于本地媒体,而我必须进行流式传输,因为它对播放速度非常重要(无等待时间等)。

非常感谢任何帮助或见解!提前致谢!


1
但是为什么你想要同时播放它们呢? - viv
1
我创建了一个应用程序来组合多媒体文档,如果用户想同时播放多个音频文件,则我想允许它。例如,将一首歌淡出,另一首歌淡入。 - user131441
我没有尝试过多个音频......但你使用的是MediaPlayer.create()还是new MediaPlayer()? - viv
1
是的,从程序上讲,您可以加载多个音频文件或流,但它们实际上在设备上无法工作,因为Android不支持它。(正如我在答案中应该引用的某个文档中提到的那样) - user131441
我仍然认为可以同时播放多个音频...... 我做了一个测试。我从内置播放器开始播放mp3,然后使用Java代码流式传输另一个mp3 URL,两者同时播放...... 所以似乎可以播放两个音频...... 你也可以测试一下...... - viv
1
那不是问题。请尝试使用同时流式传输音频的测试。 - user131441
1个回答

1

我之前曾经在调试一个应用程序时遇到过类似的问题,不过当时我没有在流式传输音频。希望这可以帮到你,但你需要根据自己的需求进行修改:

import android.media.AudioManager;
import android.media.SoundPool;
import android.media.SoundPool.OnLoadCompleteListener;
import android.util.SparseIntArray;

实例化一个SoundPool和一个SparseIntArray 这里使用的是声音文件,你需要修改这部分内容。

private static SoundPool soundPool;
private static SparseIntArray soundPoolMap;
public static final int S1 = R.raw.good_1, S2 = R.raw.bad_1,
        P1 = R.raw.power_1,
        P2 = R.raw.power_2, 
        P3 = R.raw.power_3, 
        P4 = R.raw.power_4, 
        P5 = R.raw.power_5, 
        WIN = R.raw.round_win;

初始化您的声音并将其添加到地图中。
public static void initSounds(Context context)
{
    soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 100);
    soundPoolMap = new SparseIntArray(8);    

    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
        public void onLoadComplete(SoundPool soundPool, int sampleId,
                int status) {
            loaded = true;
        }
    });
    soundPoolMap.put(S1, soundPool.load(context, R.raw.good_1, 1));
    soundPoolMap.put(S2, soundPool.load(context, R.raw.bad_1, 2));

    soundPoolMap.put(P1, soundPool.load(context, R.raw.power_1, 3));
    soundPoolMap.put(P2, soundPool.load(context, R.raw.power_2, 4));
    soundPoolMap.put(P3, soundPool.load(context, R.raw.power_3, 5));
    soundPoolMap.put(P4, soundPool.load(context, R.raw.power_4, 6));
    soundPoolMap.put(P5, soundPool.load(context, R.raw.power_5, 7));

    soundPoolMap.put(WIN, soundPool.load(context, R.raw.round_win, 8));
}

播放声音。
public static void playSound(Context context, int soundID)
{
    float volume = 1;
    if(soundPool == null || soundPoolMap == null)
    {
       initSounds(context);
    }
    soundPool.play(soundPoolMap.get(soundID), volume, volume, 1, 0, 1f);
}

一个例子:playSound(this, P1);
正在发生的是我正在使用SoundPool类,并使用SparseIntArray映射音频流。

谢谢你的回答。然而,我只能在不进行流媒体时播放同时音频文件,就像你所说的那样。流媒体似乎会破坏一切。不过,我已经有一段时间没有在Android上工作了,我相信API已经得到了很大的改进。也许你的例子现在可以用于流媒体。 - user131441

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接