3

オーディオの単純な(しかし比較的時間精度の高い)キャプチャ/レンダリングのために既存のjavax.sound.sampledライブラリを設計するためにかなりの時間を費やした後、私は本当にネイティブオーディオに到達する必要があると結論付けていますAPI。私が見つけた問題は、サウンドのフレーム位置(SourceDataLineに書き込むことによってレンダリングしている)を20または50ミリ秒の増分で、1または2ミリ秒の精度で取得できる必要があることです。つまり、いくつかのグラフィカルイベントを、再生中のオーディオに同期させたいと考えています。ビデオフレームレートは20〜50 fpsで、ジッターは1〜2ミリ秒以下です。これには、JavaSoundの実装がハードウェアから遠すぎるようです(プラットフォームの独立性に支払う代償はありますか?)。SDL / TDLバッファサイズ、オーディオ形式、SDLのサイズを何度も「いじくり回した」後。

[さらに明確にする:システムクロックに基づいて固定レートでグラフィカルレンダリングを実行させることができます。これは、私のニーズに十分に正確です。ただし、これをオーディオトラックと同期させる場合は、通常のオーディオトラック(たとえば5分)が終了に近づくまでに、わずかな時間差でもオーディオとグラフィックスの間に顕著な時間差が蓄積されます。毎秒(または2または5)同期をチェックすることを考えましたが、報告されたオーディオフレーム位置からの「ジッター」により、修正が行われ、それが目立つようになります。]

私は、どのライブラリがすでに利用可能であるかを調査してきました。既存のパッケージの多くは、ゲーム開発コミュニティをサポートすることを目的としているようです。ただし、3Dオーディオ、エフェクトのハードウェアアクセラレーション、合成、処理は必要ありません。一貫したレイテンシーで聞こえているもののフレーム位置を読み取る方法だけです。レイテンシーが100ミリ秒にもなるが一貫している場合は、それを中心に設計できます。

このタイプの機能を提供するJavaライブラリの推奨事項をいただければ幸いです。ネイティブオーディオAPIのJNIラッパーになると思います。この時点でサポートする必要があるのはWindows7だけです。OpenAL(Vistaではサポートされなくなったため、オーディオのハードウェアアクセラレーションをサポートするCreativeの「オープン」な方法のようです。ゲーム指向で必要以上のものです)、JSyn(合成、MIDIに焦点を当てており、単純なサンプルではありません)インターフェイス)およびJAsioHost(これまでで最も有望)。

JavaSound APIで指摘した制限を回避する方法があれば、それでも問題ありませんが、1週間の努力の末に諦めました。

ありがとう。

4

2 に答える 2

0

そのようなライブラリはないと思います...しかし、達成したいタスクは実際にはそれほど難しくありません:

アプリをオーディオフレームに同期する必要があります...つまり、オーディオはタイミングのマスターオーソリティです。再生用のサウンドのチャンクを定期的に投稿し、チャンク xy が再生されているというイベントを発行する新しいタイマーを作成できます。

リアルタイムと同じレートでチャンクを提供する必要があります...つまり、1秒に1秒分のサンプルを投稿します。

再生自体は、Windows の WaveOut 関数によって実行できます (リンクはこちら、チュートリアルを検索できます)。これらの関数には、JNI を使用して Java からアクセスできます。WaveOut はサウンドを Wav 形式で再生します。つまり、単純な LPC モジュレーションでデバイスを開き、生のサンプルを投稿できます。

全体が完全に同期されるわけではありませんが、遅延は大きくありません。waveOutWrite のバッファ アンダーフローに注意してください。最後のチャンクの再生が完了する前に新しいチャンクを供給する必要があります。そうしないと、サウンドが歪んでしまいます。

于 2012-05-03T00:41:45.860 に答える