2013-03-13 13 views
6

Mam następujący fragment kodu:Java ogg do konwersji 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)); 

Napisałem ten kod do transfrom MP3 i OGG do WAV. Formaty te nie są obsługiwane przez Java domyślnie jak rozumiem, więc musiałem dodać różne słoików do mojego ścieżki klasy, jak opisano tutaj:

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

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

Kod działa dobrze, gdy jestem konwersji Pliki MP3. Ale gdy próbuję przekonwertować pliki OGG pojawia się następujący błąd:

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 

Teraz to jest tylko wtedy, gdy rzucony coraz dekodowany InputStream sobie, co oznacza, że ​​plik ogg był analizowany sukcesem.

AudioSystem.getTargetEncodings(sourceFormat) 

Powyższy kod nie zwróci żadnych wartości podczas przetwarzania plików MP3 lub OGG. Jedyna różnica polega na tym, że MP3 działa dobrze.

Dodałem wszystkie słoiki, do których odnosi się poprzedni odnośnik potrzebny do konwertowania ogg, z wyjątkiem najnowszej wersji pliku jogg-0.0.7.jar, ponieważ nie mogłem go znaleźć.

Próbowałem różnych rozwiązań, takich jak JAVE, ale potrzebuję go uruchomić na MAC, a także JAVE nie uruchomi się na MAC bez jakiejś specjalnej implementacji.

Czy ktoś ma jakieś sugestie, co może powodować problem? Czy może istnieć jakieś obejście do przekonwertowania pliku OGG do formatu WAV?

EDIT:

Ow wow zdałem sobie sprawę, na czym polega problem ... Po przeczytaniu everthing w podręczniku, dowiedziałem się, że stosując dwa różne rodzaje SPI (jak w tym przypadku MP3 i OGG) może powodować problemy. Usunąłem zależność MP3 spi maven i błąd zniknął. Myślałem, że wynik wav jest w zasadzie pusty. Wszelkie sugestie na ten temat? Będę szczęśliwy, jeśli uda mi się przekonwertować OGG do formatu WAV, mogę przekształcić MP3 w inny sposób.

Moje uzależnienie pom wygląda następująco:

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

Te pliki do pobrania Chyba wszystkie słoiki Muszę zrobić pracę transformacji OGG. (Wygląda na to, że nie).

+1

Czy tego chcesz? https://poi1.googlecode.com/files/jogg-0.0.7.jar – longhua

+0

Znalazłem ten słoik po prostu nie mogłem znaleźć zależności dla niego, więc nie chciałem go używać. Próbowałem go dodać do ścieżki classpath z folderu lib, ale nie bueno. Sry, że tracę dużo czasu z tym problemem, zapomniałem o tym wspomnieć. –

+1

Dodaj tritonus_jorbis-0.3.6.jar (http://tritonus.org/tritonus_share-0.3.6.jar) może poprawnie konwertować OGG na WAV. Nie pewny dlaczego. – longhua

Odpowiedz

2

Użyj tritonus_jorbis-0.3.6.jar, aby zastąpić vorbisspi1.0.2.jar.

Podczas dekodowania oryginalnego wejścia AudioInputStream, AudioSystem pobiera wszystkie formaty SPC FormatConversionProvider i sprawdza je kolejno, dopóki nie znajdzie takiego, który może działać. Dlatego kolejność klas ścieżki jest ważna.

Sprawdź ścieżkę klas, aby upewnić się, że użyto "org.tritonus.sampled.convert.jorbis.JorbisFormatConversionProvider". Sprawdź każdy plik JAR w ścieżce klas; szukaj w nim następującego pliku. Lub po prostu umieść tritonus_jorbis-0.3.6.jar na samym początku ścieżki klasy.

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

Na jak określić kolejność, w ścieżce klasy Maven, sprawdź ten post: Maven classpath order issues.

+0

Próbowałem to nie pomogło, lub po prostu nie mogłem go uruchomić. :?. (Masz w swojej bibliotece –

+0

Co jar za indziej się tak nic nie może kolidować z niczego (jak mp3 zrobił SPI) – longhua

+0

będę edytować moje pytanie można zobaczyć moje zależność istnieje Maven I w zasadzie wyczyszczone wszystko –

1

Faktycznie, można użyć zarówno mp3spi i vorbisspi razem. Musisz tylko upewnić się, że Maven użyje właściwej wersji tryton-share. Jeśli polegasz na przechodnim mechanizmie Mavena, skończysz z trytem-share 0.3.7-1, który nie ma klasy org.tritonus.share.sampled.convert.TMatrixFormatConversionProvider. To właśnie niszczy vorbisspi.

Po prostu musiałem jawnie dodać zależność od TRITONUS-share 0.3.7-2 do mojego pom.xml i teraz zarówno odtwarzanie ogg jak i mp3 działa za pośrednictwem interfejsu API dźwięku Java.

Patrz mój post na blogu o szczegóły: http://odoepner.wordpress.com/2013/07/19/play-mp3-or-ogg-using-javax-sound-sampled-mp3spi-vorbisspi/

0

Możecie spróbować FFsampledSP (część SampledSP).

Jest to implementacja oparta na FFmpeg dla Win i OSX, która implementuje interfejsy javax.sound.sampled. Obsługiwane są OGG, FLAC itp. Zasadniczo jest to ten sam dekoder, co w innych aplikacjach FFmpeg (np. Odtwarzacz VLC i wiele innych).

Powiązane problemy