1

私は、Java で小さな音楽/リズム ゲームを作成する非常に初期の段階にいます (OpenAL を使用する Slick フレームワークを使用しますが、ここではおそらく関係ありません)。ゲームは WAV 形式のいくつかのサウンド ファイルを読み取る (および再生する) 必要がありますが、一部のファイルは [javax.sound.sampled.UnsupportedAudioFileException] 例外をスローしています。

at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1102)
at org.newdawn.slick.openal.WaveData.create(WaveData.java:123)
at org.newdawn.slick.openal.SoundStore.getWAV(SoundStore.java:713)
at org.newdawn.slick.openal.SoundStore.getWAV(SoundStore.java:683)
at org.newdawn.slick.Sound.<init>(Sound.java:33)

ファイルは Winamp または Foobar2000 で問題なく再生できるため、これは Java がファイル形式の一部のバリアントを認識しないことを意味します。この時点での選択肢は何ですか?

注:問題のファイルはユーザー提供であるため、事前に変換することはできません(大胆さなどを使用)。変換手順は実行時に行う必要があります。

4

1 に答える 1

5

ファイルについて認識する必要があることの 1 つは、それがコンテナー形式であることです。圧縮されていない PCMからMP3WAVへの変換など、さまざまな形式のデータを保持できます。

この場合、使用されているライブラリがJava Sound APIWAVにフックされており、API の実装がファイルに含まれるデータの形式をサポートしていないため、UnsupportedAudioFileException例外が発生したと推測します。

ファイルは Winamp または Foobar2000 で問題なく再生できるため、これは Java がファイル形式の一部のバリアントを認識しないことを意味します。

Winamp や他のプログラムがWAVファイルを再生できる理由は、おそらく Windows Audio Compression Managerまたは (私が正しく理解している場合) DirectShowを使用しており、さまざまな種類のオーディオ コーデックを管理するために使用されているためです。

WAVWinamp 自体は、ファイル内のオーディオ データをデコードする方法を知る必要はありません。ACM または DirectShow に、処理可能な未加工のオーディオ データを返すように要求します。(または、データがオーディオ出力に直接送信される可能性もあります。)

この時点での選択肢は何ですか?

代替手段はJava Media Frameworkの形で存在するようですが、これは多くのマルチメディア フォーマットをサポートしているようです。

「JMF 2.1.1 Windows Performance Pack」を使用すると、Windows ACM にフックするとのことでWAV、Java Sound API で再生できないファイルを再生できる可能性があります。

于 2010-05-16T13:27:43.027 に答える