2

javax サウンド API を使用して、 http://www.jsresources.org/examples/AudioPlayer.htmlに基づく単純なコンソール再生プログラムを実装しています。

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

なんらかの方法でサンプルを誤解しているようで、左チャンネルにはゲインが適用されているように見え、右チャンネルは減衰されているように見えます。

PAN および BALANCE コントロールを設定する必要があるかどうかを調べましたが、これらは使用できず、Windows XP サウンド システムの設定を確認しました。このランプ ファイルの他の形式の再生は問題ありません。

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

では、Java Sound API が私のオーディオ ストリームを変更している理由を知っている人はいますか?

4

1 に答える 1

4

24 ビット オーディオの Java 再生に関する問題は、実際には Microsoft DirectSound および/または Windows Java Sound の実装にあります。Linux で Java Sound と ALSA を使用すると、24 ビット オーディオが完全に再生されます (出力を記録すると、入力ファイルとビットが完全に一致することがわかります)。

Windows で動作しない理由を確認するには、Java で再生したい出力ラインのサポートされているオーディオ形式を照会できます (出力ラインの はどこに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) の場合、次のような結果が得られます (同じ PC でまったく同じサウンドカード、ESI Juli@ を使用):

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ビットがあります。そのため、これは期待どおりに機能し、不要な余分な処理は必要ありません。

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

これが誰かの役に立てば幸いです。これについてオンラインで他に何も見つけることができなかったので、このような古い質問に投稿しました。

以下は私の最初の質問で、回答したばかりです (参照用に残しておきます)。


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

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

セットアップに関するもう少し詳しい情報: - Windows XP SP3 で動作する Java JRE 最新バージョン (7u7 だと思います)。- jsresources.org で AudioPlayer の例 (主な質問で述べたように) を使用して再生されたサウンド (最初に自分のコードを使用してみましたが、間違いを犯した場合に備えてこれに切り替えました。結果は両方で同じです)。- オーディオは、デジタル (S/PDIF) 出力を介して M-Audio サウンドカードで再生されます。この出力は、(外部ケーブルを介して) Lynx サウンドカード (同じ PC 内) のデジタル入力に直接接続されています。録音(Sony Sound Forge 使用)。- 記録されたファイルは、入力された Wave ファイルと比較されます。

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

ASIO を使用してテスト ファイルを再生すると、4 つのファイルすべてが正しい出力を生成しました (記録を押してから再生を押すまでの時間の開始位置を揃えた後、記録されたデータはバイトごとに入力 Wave ファイル データと一致します)。

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

これを再現する最も簡単な方法は、上記の AudioPlayer の例を使用し、24 ビット ファイルを再生して出力を記録することです (サウンドカードが 1 つしかない場合は、ミキサーを使用してデータを適切にルーティングし、キャプチャされます)。違いが聞こえるほど間違っているわけではありませんが、データが予期しない方法で変更されている場合、ハイレゾ オーディオの目的に反することになります (16 ビットよりも 24 ビットを使用することでゲインが失われるリスクがありますが、ここでその議論に入りたくありません)。

これを質問として言い換えると、Java Sound で 24 ビット オーディオを正しく再生するにはどうすればよいでしょうか。

于 2012-09-27T14:46:58.647 に答える