6

次のコードスニペットがあります。

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));

このコードは、MP3およびOGGファイルからWAVファイルに変換するために作成しました。私が理解しているように、これらの形式はデフォルトでjavaでサポートされていないため、ここで説明するように、クラスパスに別のjarを追加する必要がありました。

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

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

MP3ファイルを変換しているとき、コードは正常に実行されます。しかし、OGGファイルを変換しようとすると、次のエラーが発生します。

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

これは、デコードされた入力ストリーム自体を取得するときにのみスローされるようになりました。これは、oggファイルが正常に解析されたことを意味します。

AudioSystem.getTargetEncodings(sourceFormat)

上記のコードは、MP3ファイルもOGGファイルも処理しない場合、値を返しません。唯一の違いは、MP3が正常に動作することです。

最新バージョンのjogg-0.0.7.jarを除いて、ogg変換に必要な前のリンクで参照されているすべてのjarを追加しました。これは、見つからなかったためです。

JAVEのようなさまざまなソリューションを試しましたが、MACでも実行する必要があり、特別な実装がないとJAVEはMACで実行されません。

誰かが問題を引き起こす可能性のある提案がありますか?OGGファイルをWAVに変換するための回避策はありますか?

編集:

わあ、問題が何であるかを理解しました...マニュアルのすべてを読んだ後、2つの異なる種類のSPI(この場合はMP3とOGGなど)を使用すると問題が発生する可能性があることを学びました。MP3 spi mavenの依存関係を削除すると、エラーが消えました。結果のwavは基本的に空だと思いました。それについて何か提案はありますか?OGGからWAVへの変換を機能させることができれば幸いです。MP3を別の方法で変換できます。

私のpom依存関係は次のようになります:

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

このダウンロードでは、OGG変換を機能させるために必要なすべてのjarファイルを推測します。(そうではないようです。)

4

3 に答える 3

3

tritonus_jorbis-0.3.6.jarを使用して、vorbisspi1.0.2.jarを置き換えます。

元のAudioInputStreamをデコードする場合、AudioSystemはすべてのSPIのFormatConversionProviderを取得し、機能するものが見つかるまで1つずつチェックします。したがって、クラスパスの順序は重要です。

クラスパスをチェックして、「org.tritonus.sampled.convert.jorbis.JorbisFormatConversionProvider」が使用されていることを確認してください。クラスパス内のすべてのJARを確認してください。その中の次のファイルを検索します。または、クラスパスの最初にtritonus_jorbis-0.3.6.jarを配置します。

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

Mavenでクラスパスの順序を指定する方法については、次の投稿を確認してください:Mavenのクラスパスの順序の問題

于 2013-03-13T15:19:07.257 に答える
1

実際には、mp3spiとvorbisspiの両方を一緒に使用できます。Mavenが正しいバージョンのtritonus-shareを使用することを確認する必要があります。Mavenの推移的な依存関係メカニズムに依存している場合は、クラスorg.tritonus.share.sampled.convert.TMatrixFormatConversionProviderを欠いているtritonus-share0.3.7-1になります。それがvorbisspiを壊すものです。

tritonus-share 0.3.7-2への依存関係をpom.xmlに明示的に追加する必要がありました。これで、oggとmp3の両方の再生がJavaサウンドAPIを介して機能します。

詳細については、私のブログ投稿を参照してください:http: //odoepner.wordpress.com/2013/07/19/play-mp3-or-ogg-using-javax-sound-sampled-mp3spi-vorbisspi/

于 2013-07-25T15:07:27.163 に答える
0

FFsampledSP(SampledSPの一部を試してみることをお勧めします。

これは、インターフェイスを実装するWinおよびOSX用のFFmpegベースの実装です。javax.sound.sampledOGG、FLACなどがサポートされています。これは基本的に、他のFFmpegアプリケーション( VLCプレーヤーや他の多くのアプリケーションなど)で使用されているものと同じデコーダーです。

于 2013-11-10T18:01:36.137 に答える