Domanda

Recentemente ho chiesto una domanda su controllare il volume di un Java clip audio e ' stato suggerito che cerco JMF.Come sto usando una vecchia versione di JVM (1.4) e solo interessato a giocare in file WAV, JMF è stata la soluzione perfetta e ha notevolmente semplificato il codice per il caricamento, il gioco, e di controllare il volume del clip audio nella mia applicazione.

Ma sto avendo problemi fermare la clip su richiesta.Sembrerebbe semplice come chiamare player.stop(), ma stop() sembra un blocco fino a quando il giocatore ha finito di giocare.Ecco un semplice esempio di codice:

Player p = Manager.createRealizedPlayer( f.toURI().toURL() );

p.start();
System.out.println( "Player playing" );

Thread.sleep( 1000 );
System.out.println( " Clip is at time: " + p.getMediaTime().getSeconds() );

p.stop();
System.out.println( " Clip is at time: " + p.getMediaTime().getSeconds() );

Questo produce un output del tipo:

Player playing
 Clip is at time: 0.8591836730000001
 Clip is at time: 3.227619047

Dove mi sarei aspettato il secondo tempo di leggere uguale o solo brevemente oltre la prima.(O forse sono stato reimpostato a 0 o qualcosa del genere.) Ho anche provato p.setStopTime( p.getMediaTime() ).Questo ferma la clip sul tempo, ma gioca una frazione di secondo di distorsione prima di fermarsi, che è indesiderabile.

Googling intorno mi fa pensare che gli altri non stanno avendo questo problema, ed è stato difficile trovare delle opzioni.Questo potrebbe essere un problema di buffering o mi manca qualcosa?Qualsiasi analisi in grado di fornire è molto apprezzato.


Dettagli: Sto usando (e non modificabile) JVM 1.4.2 con JMF 2.1.1.Tutti i miei file WAV sono solo da 1 a 10 secondi.

È stato utile?

Soluzione

E in effetti era un problema di buffering.Mi ci è voluto un po ' per trovare questo perché quando ho tentato di visualizzare i Comandi disponibili con il seguente frammento di codice, non c'erano BufferControls elencati:

Player p = ...
Control cs[] = p.getControls();
for ( int j = 0; j < cs.length; j++ )
  System.out.println( "  Found control: " + cs[j].getClass().getCanonicalName() );

Alla fine ho appena fatto un cieco pugnalata a ottenere un BufferControl con questo frammento e ha funzionato:

BufferControl bc = (BufferControl) p.getControl( "javax.media.control.BufferControl" );

Dopo di tastatura e armeggiare intorno alcuni più si è scoperto che il buffer predefinito lunghezza era di 2 secondi.Ridurre la lunghezza del buffer di 1 secondo mi ha permesso di correttamente interrompere i file WAV che erano 2,5 secondi o più.Ulteriore riduzione a .5 secondi ha finito per dare a me il comportamento che mi è stato originariamente cerca in tutti i miei file di input.

Senza guardare il JMF origine, sto assumendo che ero solo in esecuzione in un problema in cui l'audio era in corso la lettura e giocato in 2 seconda pezzi (2 sec la lunghezza del buffer). e che tali blocchi dovuto finire in corso, per qualsiasi motivo, prima di poter essere fermato.La riduzione per il .5 secondi non potrebbe in realtà essere la risoluzione del problema (se i suoni di continuare a giocare dopo che hai detto di smettere), ma sarà almeno ridurre il problema al punto di non essere più evidente.Inoltre, tutti i miei file WAV sono piccole e locali, quindi la latenza o salta in riproduzione non dovrebbe essere un problema.

Alla fine, qui è la revisione del frammento di codice domanda originale che provoca il comportamento desiderato:

Player p = Manager.createRealizedPlayer( f.toURI().toURL() );

BufferControl bc = (BufferControl) p.getControl( "javax.media.control.BufferControl" );
if ( bc != null )
  bc.setBufferLength( 500 ); // buffer length specified in milliseconds

p.start();
System.out.println( "Player playing" );

Thread.sleep( 1000 );
System.out.println( " Clip is at time: " + p.getMediaTime().getSeconds() );

p.stop();
System.out.println( " Clip is at time: " + p.getMediaTime().getSeconds() );

Altri suggerimenti

Ho avuto questo problema con un breve file audio, troppo.Imposta il buffer non ha aiutato.Ho finito per aggiunta di silenzio per l'audio in audacity.

Io odio JMF :)

Edit:Beh, JMF blocca anche GainControl.setLevel() chiamate quando si dispone di un breve file audio.Credo che la radice del problema è la stessa, JMF a pochi isolati di richiesta (impostare il volume, stop) fino a pochi file è completo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top