Soundpool只播放文件的前5秒。为什么?

时间:2012-11-14 11:06:00

标签: android soundpool

我在我的应用程序中使用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。我希望你不会像我那样花那么多时间)

5 个答案:

答案 0 :(得分:14)

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

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

所以它不关心ogg或wav。

答案 1 :(得分:10)

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

this discussion

中找到了解决方案

答案 2 :(得分:8)

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

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

mediaPlayer = MediaPlayer.create(this, R.raw.audio_file);
mediaPlayer.start();

答案 3 :(得分: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

非常注意

答案 4 :(得分:0)

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

在我的案例中减少文件。