質問

Javax Sound APIを使用して、に基づいてシンプルなコンソール再生プログラムを実装しています http://www.jsresources.org/examples/audioplayer.html.

24ビットランプファイルを使用してテストした場合(各サンプルは最後のサンプルであり、24ビット範囲全体で1つのサンプル1です)、再生中に何か奇妙なことが起こっていることが明らかです。記録された出力はファイルの内容ではありません(これを確認するためのデジタルループバックがあります)。

サンプルを何らかの形で誤解しているように思われ、左チャネルがそれにいくらかのゲインが適用されているように見え、適切なチャネルが減衰しているように見えます。

PANとBalance Controlsには設定が必要かどうかを調べましたが、これらは利用できず、Windows XPサウンドシステムの設定を確認しました。このランプファイルの他の形式の再生は問題ありません。

16ビットファイルで同じテストを行うと、ストリームの破損なしで正しく実行されます。

Java Sound APIが私のオーディオストリームを変更している理由を誰かが考えていますか?

役に立ちましたか?

解決

24ビットオーディオのJava再生に関する問題は、実際にはMicrosoft Directsoundおよび/またはWindows Javaサウンドの実装を使用しています。 JavaサウンドとALSAでLinuxを使用して、24ビットオーディオは完全に再生されます(出力を記録すると、入力ファイルと少し完璧な一致が表示されます)。

Windowsで機能しない理由を確認するには、Javaを使用して再生する出力ラインのサポートされているオーディオ形式をクエリすることができます(Where lineInfo それは Line.Info 出力行の):

DataLine.Info dataLineInfo = (DataLine.Info) lineInfo;

そして、サポートされている形式をループします:

for (AudioFormat lineFormat : dataLineInfo.getFormats())

Windowsの場合、私は次のようなものを手に入れます:

Format #1: PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #2: PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #3: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
Format #4: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
Format #5: PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
Format #6: PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
Format #7: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
Format #8: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian

サポートされている形式として24ビットはありません。しかし、Windows XPでは、24ビットオーディオをプレイさせてくれましたが、おそらくJava / DirectSoundで16ビットまで処理され、サウンドカードで24ビットまで戻ってきました。したがって、データ出力が正しくない理由。 Windows 7では、24ビットオーディオを再生することを拒否したことがわかりました(とにかくすべてが16ビットになると、おそらくより賢明です)。

Linux(Fedora 17)の場合、私は(まったく同じサウンドカード、ESI Juli@、同じPCで)のようなものを手に入れます:

Format #1: PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, little-endian
Format #2: PCM_SIGNED unknown sample rate, 32 bit, mono, 4 bytes/frame, big-endian
Format #3: PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, little-endian
Format #4: PCM_SIGNED unknown sample rate, 32 bit, stereo, 8 bytes/frame, big-endian
Format #5: PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, little-endian
Format #6: PCM_SIGNED unknown sample rate, 24 bit, mono, 4 bytes/frame, big-endian
Format #7: PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, little-endian
Format #8: PCM_SIGNED unknown sample rate, 24 bit, stereo, 8 bytes/frame, big-endian
Format #9: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, little-endian
Format #10: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, big-endian
Format #11: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, little-endian
Format #12: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, big-endian
Format #13: PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, little-endian
Format #14: PCM_SIGNED unknown sample rate, 20 bit, mono, 3 bytes/frame, big-endian
Format #15: PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, little-endian
Format #16: PCM_SIGNED unknown sample rate, 20 bit, stereo, 6 bytes/frame, big-endian
Format #17: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
Format #18: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
Format #19: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
Format #20: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
Format #21: PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #22: PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame,
Format #23: PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame,
Format #24: PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame, 

サポートされた形式として24ビットがあります。そのため、これは期待どおりに機能し、不要な追加処理なしで機能します。

したがって、24ビットの再生はJavaサウンドで動作します。これは、OS固有(およびおそらくデバイス固有の可能性がありますが、これまでに試したデバイス間にバリエーションが見つかりません)を実装しているようです。サポートされているオーディオ形式。私のテストでは、Linux(ALSA)がサポートしているのに対し、Windows(DirectSound)はサポートしていないことが示唆されています。

これが誰かに役立つことを願っています。このオンラインで他に何も見つからなかったので、私はそのような古い質問に投稿しました。

以下は私の最初の質問でしたが、私はちょうど答えました(私はそれを参照のために残しました):


これが古い質問をぶつける正しい手順であるかどうかはわかりませんが、FAQを読むことから、これが新しいものを投稿するよりも好ましいと思われます。私はすでにこの問題を他のいくつかの場所(Oracle Java Sound Forumを含む)に投稿しましたが、これまでのところ回答がなく、この質問は私が抱えている問題とまったく同じように聞こえます。

Java Soundを使用してオーディオファイル(標準のPCM形式)を再生しますが、SoundCardからのデータ出力がファイルからの入力と一致しないという点で、24ビットデータを正しく再生しないことに気付きました。 16ビット(および8ビット)オーディオデータでは正常に動作しますが、24ビット(そしておそらく32ビットではありませんが、テストする実際の32ビットオーディオファイルはありません)ファイルはありません。出力から、Java Soundは、サウンドカードに渡す前に、オーディオデータに追加の(および不要な)処理を行うように見えます。ファイルを再生するためにASIOを使用して同じテストを実行した場合、問題はなく、データが予想どおりに一致するため、Java Soundがこれを行っているのはJava Soundであると確信できます。

セットアップに関するもう少し情報:-Java JRE最新バージョン(7U7私は思う)、Windows XP SP3で実行されています。 -jsresources.orgのaudioplayerの例(主な質問で言及されているように)を使用して音が再生されました(最初に自分のコードを使用しようとしましたが、間違いを犯した場合にこれに切り替えましたが、結果は両方で同じです)。 - 演奏は、デジタル(s/pdif)を介してm-audioサウンドカードにあり、(外部ケーブルを介して)直接接続されています。記録(Sony Sound Forgeを使用)。 - 記録されたファイルは、入力ウェーブファイルと比較されます。

テストでは、4つの異なる入力ウェーブファイルが使用されます(同じソースファイルから生成されます):-16ビット、44.1 kHz。 -16ビット、48 kHz; -24ビット、44.1 kHz; -24ビット、48 kHz。

ASIOを使用してテストファイルを再生すると、4つのファイルすべてが正しい出力を生成しました(記録されたデータは、記録を押すこととプレスプレイの間の時間の開始位置を調整した後、バイトの入力ウェーブファイルデータバイトと一致します)。

Javaを使用してテストファイルを再生すると、16ビットのファイル(44.1 kHzと48 kHzの両方)が正しい出力を生成しますが、24ビット(44.1 kHzと48 kHzの両方)はそうではありません。それだけでなく、出力が正しくない方法が一貫していません(テストを2回実行すると、毎回異なる出力が生成されますが、どちらも入力ファイルと一致することに近づきません)。したがって、Javaは24ビットファイルを誤って再生するだけでなく、毎回異なる方法で誤ってそうしています。それが役立つ場合、私は入力ファイル(予想出力)と比較してJavaサウンド出力のスクリーンショットを撮ることができます。

これを再現する最も簡単な方法は、上記のAudioplayerの例を使用し、24ビットファイルを再生し、出力を記録することです(サウンドカードが1つしかない場合は、ミキサーを使用してデータを適切にルーティングして、キャプチャされた)。違いを聞くことができるほど間違っているわけではありませんが、データが何らかの予想外の方法で変更されている場合、高解像度のオーディオの目的を打ち負かすことができます(16ビットを超える24ビットを使用することで利益を失う危険がありますが、ここで本当にその議論に触れたくない)。

これを質問としてフレーズするために - Javaサウンドを24ビットオーディオを正しく再生するにはどうすればよいですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top