12

Sto cercando di eseguire loop di file ogg oggettivi (20kb) senza pause con la classe SoundPool e non è possibile ottenere risultati coerenti durante il test sull'hardware. Riproduce sempre perfettamente utilizzando l'emulatore, ma quando eseguo il test su un Nexus 1 o su un Samsumg Galaxy Tab 10.1 sono presenti pop o clic udibili ad ogni punto del loop. Ciò che è molto strano è che, anche se consistente una volta avviata l'applicazione, i clic sono leggermente diversi ogni volta che riavvio l'app e in rare occasioni (più frequentemente sul tablet) il ciclo viene riprodotto correttamente.Ciclo continuo con SoundPool su Android?

I risultati non sono migliori con MediaPlayer. È irragionevole aspettarsi una riproduzione senza pause di loop audio su Android? Sicuramente qualcuno ha funzionalità simili che funzionano correttamente? Se è così mi piacerebbe vedere un esempio di come funziona.

Grazie!

+0

Sono sulla stessa barca, i file WAV si comportano male allo stesso modo: un loop senza pause perfetto sembra impossibile. Se provi a fadein/out il primo e l'ultimo 10 sample della traccia, allora sentirai distintamente la pausa lunga millisecondo, nessun clic, ma la dissolvenza è molto udibile .. o_O – Manuel

+3

Difficile è un sacco di problemi per cosa vuoi, puoi sempre usare AudioTrack, che usa un flusso continuo di bit. – user717572

+0

Sembrerà stupido ma è (apparentemente) irragionevole aspettarsi una riproduzione audio senza pause. – SARose

risposta

4

ho usato un hack che funziona bene per i file singoli:

HACK_loopTimer = new Timer(); 
HACK_loopTask = new TimerTask() {    
    @Override public void run() { 
     mMediaPlayer.seekTo(0); 
    } 
}; 
long waitingTime = mMediaPlayer.getDuration()-mHackLoopingPreview; 
HACK_loopTimer.schedule(HACK_loopTask, waitingTime, waitingTime); 

Basta impostare mHackLoopingPreview ad un importo ragionevole; Sto usando 100ms e sta funzionando bene. Devo ammettere che questa è una soluzione meno che ideale e , ma almeno fa il suo lavoro.

+1

funziona, ma non quando l'applicazione è in background c'è un po 'di spazio nel loop – farrukh

+1

Potresti estendere un po' di più l'esempio? Ad esempio, dove chiami start() o prepare()? –

+0

Questo non ha funzionato per me affatto. Forse perché non l'ho implementato nel posto giusto come sottinteso @ Primož'c0dehunter'Kralj. – SARose

0

Questo potrebbe sembrare un poliziotto ma ci sono due cose che puoi provare, la prima delle quali ha funzionato per me.

  1. farvi i file audio Ogg formato alla frequenza di campionamento 48kHz e 48kbit/s (Questo ha funzionato per me)

  2. È possibile creare 2 MediaPlayer oggetti e (proprio come risposta @Beowulf Bjornson 's) circa < = 100 ms avvia MediaPlayer # 2 appena prima che MediaPlayer # 1 termini e si alternhi tra l'intero tempo.

Speranza persone che vengono qui cerca quello che ho detto perché ho sprecato circa 3 giorni cercando di capire questo fuori solo per essere stupito che non ci sia un out of the box modo per farlo senza problemi .

1

ho trovato altra soluzione:

afd = assetManager.openFd(nameSound); 

player.setDataSource(afd.getFileDescriptor(), 
        afd.getStartOffset(), afd.getLength() - 1000); 
afd.close(); 
player.prepare(); 
player.setLooping(true); 
player.start(); 

Hai solo bisogno di definire la durata 1000 (1 ms) inferiore, invece, che la durata totale. Y eso es todo, problema resuelto !!!!

Problemi correlati