Как запретить SoundPool обрезать звуки

У меня есть приложение звуковой панели, и я использую SoundPool для управления воспроизведением своих звуков. Все работало отлично, пока я не попытался добавить звук продолжительностью около 30 секунд. Когда я нажимаю кнопку для этого звука, он воспроизводится всего несколько секунд, а затем останавливается. Есть ли способ предотвратить это с помощью SoundPool? Вот мой код. Спасибо!

public class SoundManager {

private  SoundPool mSoundPool; 
private  HashMap<Integer, Integer> mSoundPoolMap; 
private  AudioManager  mAudioManager;
private  Context mContext;


public SoundManager()
{

}

public void initSounds(Context theContext) { 
     mContext = theContext;
     mSoundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); 
     mSoundPoolMap = new HashMap<Integer, Integer>(); 
     mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);         
} 

public void addSound(int Index,int SoundID)
{
    mSoundPoolMap.put(Index, mSoundPool.load(mContext, SoundID, 1));

}

public void playSound(int index)
{
float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f);
}

public void playLoopedSound(int index)
{
    float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, 1f);
}
}

person Nick    schedule 21.08.2011    source источник


Ответы (4)


Есть некоторая информация о Soundpool, которую я получаю при разработке своего музыкального приложения. Вот несколько рекомендаций, которые не описаны в исходной документации, основанной на ограничениях длины звука:

   Length of Sound              Khz
--------------------      ---------------
     1-5 Secs.             44khz - Stereo
    6-11 Secs.             22khz - Stereo
   12-21 Secs.             11khz - Mono
     21+ Secs.              8khz - Mono 

Поэтому, если у вас есть какие-либо аудиофайлы, которые SoundPool обрезает, конвертируйте их с помощью этого. Конечно, при преобразовании в 11 кГц или ниже звук начинает звучать немного некачественно, но это лучше, чем ничего. Программа, которую я использую для конвертации: Free MP3 WMA OGG Converter. Я всегда использую файлы ogg при работе с Soundpool. Надеюсь, это поможет людям.

person abotrix    schedule 12.09.2014

SoundPool имеет ограничение внутренней памяти в 1 (один) Мб. Вы можете попасть в это, если ваш звук очень высокого качества. Если у вас много звуков и вы достигаете этого предела, просто создайте больше звуковых пулов и распределите по ним свои звуки.

person Dominic Cerisano    schedule 08.10.2013

SoundPool — это легкий проигрыватель, который декодирует только первые 1 Мб данных, но если вы хотите использовать более качественный или длинный аудиофайл, вам необходимо:

* Use MediaPlayer interface instead of SoundPool. MediaPlayer is more complicated mechanism so the playback startup time longer than SoundPool.
* Use MediaCodec API to decode data firstly then call AudioTrack API to playback PCM data as requested.This solution will decode the data firstly then do PCM playback directly, so the delay will be the same as SoundPool but it's more complicated for programming.
person lucky1928    schedule 30.11.2013

он предназначен только для воспроизведения коротких звуков, прочитайте страницу SDK.

person calav3ra    schedule 18.11.2011
comment
В документах SDK нигде не сказано, что это «только для коротких звуков». - person Jeff Gates; 18.02.2020