2012-11-14 17 views
14

Io uso Soundpool nella mia app, finora funziona bene, ma ho un file wav, che è di 10 secondi. Sfortunatamente, Soundpool riproduce solo i primi 5 secondi. Come rendere Soundpool per riprodurre l'intera traccia? Ho convertito wav - ogg e mp3 hanno ancora lo stesso problema. Gioca solo i primi 5 secondi. Qualsiasi aiuto sarebbe molto apprezzato.Soundpool riproduce solo i primi 5 secondi di file. Perché?

//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 Ultimo: Forse qualcuno lo troverà qui e lo leggerà. Sembra che la soundpool non suoni più di 5 secondi. È il massimo, per i suoni più lunghi usa MediaPlayer. Spero che non si spendono così tanto del vostro tempo come ho fatto io)

+1

Mostra file e il codice – Yahor10

+0

@ Yahor10, ho aggiunto un pezzo di codice, vuoi avere quel file wav anche? Perché ho provato con altri wav, lo stesso risultato non più di 5 secondi – Daler

+0

Qualcosa nel tuo logcat? So che i file Soundpool sono limitati a essere piuttosto brevi (dati PCM non compressi da 1 MB), forse è troppo lungo? Ci dovrebbe essere qualche messaggio nel logcat, penso. – Tim

risposta

12

Quindi penso che hai raggiunto il limite di 1M in Soundpool.

SOUNDPOOL è codificare la dimensione del buffer come 1M, per tutti file caricato, conservare in formato PCM.

Quindi non si preoccupano di OGG o WAV.

+1

em, per l'audio, c'è anche un limite rigido di 32 oggetti AudioTrack attivi (SoundPool, MediaPlayer usa AudioTrack per la riproduzione) per _device_ (non per app). – ifreedom

+0

come posso raggiungere il limite di 1M? 2shared.com/audio/aYty0aVm/loop1.html(click sulla seconda riga di download) --Scarica questo ciclo e controllalo da te con soundpool, se riesci. Aggiungi solo questo ciclo ed è inferiore a 1 M. Penso che Soundpool sia stato progettato per suonare suoni brevi, e 5 secondi è il suo limite massimo. – Daler

+0

È documentato * ovunque *? Non avrei sprecato due ore della mia vita se la [pagina SoundPool] (http://developer.android.com/reference/android/media/SoundPool.html) avesse menzionato che i miei suoni potrebbero essere troppo lunghi. –

3

Questa attività è per me funziona

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 

    } 
} 

È necessario caricare sembri asincronia e verificare la cache audio - può essere troppo pieno.

leggere questo articolo http://www.google.by/url?http://www.vogella.com/articles/AndroidMedia/article.html

sua molto attenti

+0

nel tuo codice niente di diverso, il mio è lo stesso. Sto creando app per minsdk-7 onLoad richiesto api-8. Per puntare, se il suono non verrà caricato, non verrà riprodotto affatto.Perché devo controllare se è caricato o no? Nel mio caso suona ma solo gli abeti 5 secondi. Sembra che sia un problema di Soundpool. Prova da solo se riesci a riprodurre un file che è più di 5 secondi, prova a giocare per 10 secondi. – Daler

+0

Mostra il tuo file. Proverò a inserirlo nel mio codice – Yahor10

+0

ecco un link http://www.2shared.com/audio/aYty0aVm/loop1.html, fai clic sul secondo "download" - raw .. tahnks per il tuo aiuto – Daler

10

Abbiamo risolto problema simile diminuendo nel nostro effetti .ogg frequenza di campionamento *. Il nostro tasso di campione iniziale era di 44 kHz ~ e solo 10 secondi del suono riprodotto, in diminuzione di 16 kHz migliora la giocabilità a 30 secondi

soluzione è stata trovata in this discussion

+1

+1 sugli effetti della frequenza di campionamento per la durata del suono. Tuttavia, non possiamo ridurre le frequenze di campionamento in qualsiasi momento, quindi in ogni caso, per suoni più lunghi sarebbe una buona decisione usare MediaPlayer. Entrambi hanno i loro vantaggi, quindi la decisione dovrebbe essere presa da dev. Grazie ancora per aver postato la tua soluzione, è interessante. – Daler

7

Soundpool progettato per riprodurre gli effetti sonori brevi. Per riprodurre la musica (file audio grandi) è necessario utilizzare MediaPlayer

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

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

Il file è probabilmente troppo grande. Prova a passare da stereo a mono, se non hai bisogno di stereo comunque. Oppure prova a ridimensionare il tuo file.

Ridurre il filesice lavorato nel mio caso.

Problemi correlati