2013-03-13 24 views
6

Ho il seguente frammento di codice:Java ogg alla conversione wav

File file = new File(sourceFile); 
AudioInputStream in = AudioSystem.getAudioInputStream(file); 
AudioInputStream din = null; 
AudioFormat baseFormat = in.getFormat(); 

AudioFormat decodedFormat = new AudioFormat(
       AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 
       16, baseFormat.getChannels(), baseFormat.getChannels() * 2, 
       baseFormat.getSampleRate(), false); 

din = AudioSystem.getAudioInputStream(decodedFormat, in); 
AudioSystem.write(din, AudioFileFormat.Type.WAVE, new File(targetFile)); 

Ho scritto questo codice per transfrom file MP3 e OGG in file WAV. Questi formati non sono supportati da Java per default a quanto ho capito, quindi ho dovuto aggiungere diversi vasi al mio percorso di classe, come descritto qui:

http://www.javazoom.net/mp3spi/documents.html

http://www.javazoom.net/vorbisspi/documents.html

Il codice viene eseguito bene quando sto convertendo File MP3 Ma quando cerco di convertire i file OGG ottengo il seguente errore:

java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian from VORBISENC 44100.0 Hz, unknown bits per sample, stereo, 1 bytes/frame, 16000.0 frames/second 

Ora questo è gettato solo quando ricevendo il decodificato InputStream in sé, il che significa che il file ogg è stato analizzato con successo.

AudioSystem.getTargetEncodings(sourceFormat) 

Il codice sopra riportato non restituisce alcun valore, durante l'elaborazione di file MP3 o OGG. L'unica differenza è che l'MP3 funziona bene.

Ho aggiunto tutti i jar a cui fa riferimento il collegamento precedente necessario per la conversione ogg tranne l'ultima versione di jogg-0.0.7.jar perché non riuscivo a trovarlo.

Ho provato diverse soluzioni come JAVE ma ho bisogno che funzioni anche su MAC, e JAVE non funzionerà su MAC senza qualche implementazione speciale.

Qualcuno ha qualche suggerimento che cosa può causare il problema? Può esserci qualche soluzione per convertire i file OGG in WAV?

EDIT:

Ow wow ho capito qual è il problema ... Dopo aver letto everthing sul manuale, ho imparato che l'utilizzo di due diversi tipi di SPI (come in questo caso MP3 e OGG) può causare i problemi. Ho rimosso la dipendenza da MP3 spi maven e l'errore è scomparso. Ho pensato che il risultato wav fosse fondamentalmente vuoto. Qualche suggerimento su questo? Sarò felice se riuscirò a far funzionare OGG in trasformazione WAV, posso trasformare MP3 in un altro modo.

mia dipendenza pom si presenta così:

<dependency> 
    <groupId>com.googlecode.soundlibs</groupId> 
    <artifactId>vorbisspi</artifactId> 
    <version>1.0.3-1</version> 
</dependency> 

Questo download Credo che tutto vasetti ho bisogno di fare il lavoro OGG trasformazione. (Sembra che non sia.)

+1

È questo quello che vuoi? https://poi1.googlecode.com/files/jogg-0.0.7.jar – longhua

+0

Ho trovato che jar non riusciva a trovare la dipendenza Maven per questo, quindi non volevo usarlo. Ho provato a caricarlo aggiungendolo a classpath da una cartella lib ma non bueno. Sry Ho sprecato un sacco di tempo con questo problema, ho dimenticato di dirlo. –

+1

Aggiungi tritonus_jorbis-0.3.6.jar (http://tritonus.org/tritonus_share-0.3.6.jar) può convertire OGG in WAV correttamente. Non so perché. – longhua

risposta

2

Utilizzare tritonus_jorbis-0.3.6.jar per sostituire vorbisspi1.0.2.jar.

Durante la decodifica di AudioInputStream originale, AudioSystem ottiene tutti i FormatConversionProvider di SPI e ne controlla uno a uno finché non ne trova uno che può funzionare. Quindi l'ordine del classpath è importante.

Controllare il percorso di classe per assicurarsi che "org.tritonus.sampled.convert.jorbis.JorbisFormatConversionProvider" sia utilizzato. Controllare ogni JAR nel classpath; cerca il seguente file in esso. Oppure posiziona tritonus_jorbis-0.3.6.jar all'inizio del classpath.

META-INF\services\javax.sound.sampled.spi.FormatConversionProvider 

Per informazioni su come specificare l'ordine classpath in Maven, controllare questo post: Maven classpath order issues.

+0

Ho provato questo non ha aiutato, o semplicemente non riuscivo a farlo funzionare. : ( –

+0

Quali JAR avete nel vostro grimorio? – longhua

+0

Modificherò la mia domanda potete vedere lì la mia dipendenza da Maven. Ho eliminato in modo semplice tutto il resto, quindi niente può entrare in conflitto con qualcosa (come fece mp3 spi) –

1

In realtà, è possibile utilizzare sia mp3spi che vorbisspi insieme. Devi solo assicurarti che Maven utilizzi la versione corretta di tritonus-share. Se ti affidi al meccanismo di dipendenza transitivo di Maven, finirai con tritonus-share 0.3.7-1 che manca la classe org.tritonus.share.sampled.convert.TMatrixFormatConversionProvider. Ecco cosa rompe vorbisspi.

Ho appena dovuto aggiungere esplicitamente una dipendenza da tritonus-share 0.3.7-2 al mio pom.xml e ora sia la riproduzione ogg che mp3 funziona tramite Java Sound API.

Vedi il mio post sul blog per i dettagli: http://odoepner.wordpress.com/2013/07/19/play-mp3-or-ogg-using-javax-sound-sampled-mp3spi-vorbisspi/

0

Si potrebbe desiderare di provare FFsampledSP (parte di SampledSP).

È un'implementazione basata su FFmpeg per Win e OSX che implementa le interfacce javax.sound.sampled. OGG, FLAC ecc. Sono supportati. È fondamentalmente lo stesso decoder di quelli usati in altre applicazioni FFmpeg (come il player VLC e molti altri).