25

我在我的应用程序中使用 Soundpool,到目前为止效果很好,但我确实有一个 10 秒的 wav 文件。不幸的是,soundpool 只播放前 5 秒。如何让 soundpool 播放整首曲目?我已将 wav 转换为 -- ogg 和 mp3 仍然是同样的问题。它只播放前 5 秒。任何帮助将非常感激。

//set up audio player
mSoundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
//load fx
mSoundPoolMap.put(RAW_1_1, mSoundPool.load(this, R.raw.loop1, 1));
//playing soundpool
case R.id.button1:          
mSoundPool.stop(mStream1);
mStream1= mSoundPool.play(mSoundPoolMap.get(RAW_1_1), streamVolume, streamVolume, 1, LOOP_1_TIME, 1f);

UPD Last: 也许有人会在这里找到并阅读它。似乎 soundpool 不能播放超过 5 秒。这是他的最大值,对于更长的声音使用 MediaPlayer。我希望你不会像我那样花太多时间)

4

5 回答 5

15

所以我认为你在 SoundPool 中达到了 1M 的限制。

SoundPool 将缓冲区大小硬编码为 1M,对于所有加载的文件,以 pcm 格式存储。

所以它不关心ogg或wav。

于 2012-11-23T15:46:06.740 回答
12

我们通过降低 *.ogg 效果采样率解决了类似的问题。我们的初始采样率为 44 kHz ~ 只播放了 10 秒的声音,降低到 16 kHz 将可播放性提高到 30 秒

在这个讨论中找到了解决方案

于 2014-03-13T08:29:16.133 回答
12

SoundPool 旨在播放短音效。要播放音乐(大音频文件),您需要使用MediaPlayer

// R.raw.audio_file - res/raw/audio_file.mp3

mediaPlayer = MediaPlayer.create(this, R.raw.audio_file);
mediaPlayer.start();
于 2014-10-08T09:56:03.677 回答
3

这个活动对我有用

public class MainActivity extends Activity {

    private Integer soundID;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
        // Load the sound
        AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
        float actualVolume = (float) audioManager
            .getStreamVolume(AudioManager.STREAM_MUSIC);
        float maxVolume = (float) audioManager
            .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        final float volume = actualVolume / maxVolume;

        SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);

        soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
          @Override
          public void onLoadComplete(SoundPool soundPool, int sampleId,
              int status) {
                      @Override
      public void onLoadComplete(SoundPool soundPool, int sampleId,
          int status) {
          soundPool.play(soundID, volume, volume, 1, 0, 1f);
          try {
            Thread.sleep(5000); // play twice
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          soundPool.play(soundID, volume, volume, 1, 0, 1f);
      }
    });
          }
        });
        soundID = soundPool.load(this, R.raw.sound2, 1);
      //load fx
      //playing soundpool

    }
}

您必须加载声音异步并检查音频缓存 - 它可能会溢出。

阅读这篇文章 http://www.google.by/url?http://www.vogella.com/articles/AndroidMedia/article.html

它非常细心

于 2012-11-14T12:11:37.070 回答
0

您的文件可能太大。如果您仍然不需要立体声,请尝试从立体声更改为单声道。或者尝试对您的文件进行下采样。

减少文件在我的情况下有效。

于 2016-11-24T13:04:25.007 回答