【问题标题】:Android -- Multiple, Simultaneous Streaming AudioAndroid -- 多个同时流式传输音频
【发布时间】:2011-04-12 22:46:55
【问题描述】:

我目前需要在 Android 设备上实现一个可以打开实时音频流并将其回放给用户的应用程序。这没什么大不了的,我已经成功地设置了一个流媒体服务器并让它为一个文件工作。但是,我的问题是,如何一次流式传输和播放多个音频文件?

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

我研究过使用 SoundPool,但它似乎只适用于本地媒体,我必须拥有这种流媒体,因为它对回放速度很重要(无需等待时间等)。

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

【问题讨论】:

  • 但是你为什么要同时播放它们......?
  • 我创建了一个应用程序来编写多媒体文档,如果用户想一次播放多个音频文件,那么我希望允许它。例如,在另一首歌曲淡入时淡出一首歌曲。
  • 我没有尝试过多个音频......但是你使用了 MediaPlayer.create() 还是 new MediaPlayer() ?
  • 是的,您可以通过编程方式加载多个音频文件或流,但它们实际上无法在设备上运行,因为 android 不支持它。 (正如我真的应该在我的回答中引用的文档中某处提到的那样)
  • 这不是问题.. 使用同步流音频进行测试

标签: java android audio streaming media-player


【解决方案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 已经有了很大的改进。也许您的示例现在适用于流式传输。
猜你喜欢
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 2012-04-03
  • 2019-10-13
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多