2012-05-02 3 views
1

シンプルな(しかし比較的時間精度の高い)キャプチャ/オーディオのレンダリングのために、既存のjavax.sound.sampledライブラリの周りに自分のやり方を設計しようとかなりの時間を費やした後、私は本当に到達する必要があると結論づけていますネイティブオーディオAPI私が見つけた問題は、サウンドのフレーム位置(私がSourceDataLineに書き込むことによってレンダリングしている)を1ミリ秒または2ミリ秒に正確に20ミリ秒または50ミリ秒単位で取得できる必要があることです。言い換えると、いくつかのグラフィカルイベントを再生中のオーディオに同期させたいのですが、ビデオフレームレートは20〜50 fps、ジッターは1または2ミリ秒以下です。 JavaSound実装は、これに対してハードウェア(プラットフォームの独立性を犠牲にするための価格)からあまりにも離れているようです。 SDL/TDLのバッファサイズ、オーディオフォーマット、SDL.write()とTDL.read()バッファのサイズ、書き込み頻度などを多用すると、フレームの変化を避ける方法が見つけられませんシステムクロックと比較して報告された位置(1ミリ秒の分解能で、マイクロ秒ではない)。Windows用JavaラッパーDirectSound/WASAPI /?をお探しですか?オーディオ

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

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

このタイプの機能を提供するJavaライブラリの推奨事項をお読みいただきたいと思います。私はそれがネイティブオーディオAPIのJNIラッパーであると推測します。私はこの時点でWindows7をサポートする必要があります。私はOpenALを見たことがあります(私は必要以上にVistaでサポートされていないので、オーディオのハードウェアアクセラレーションをサポートするCreativeの「オープン」な方法です)、JSyn(シンセシス、MIDI、シンプルサンプルではなくインターフェイス)とJAsioHost(これまでのところ最も有望です)。

私がJavaSound APIで指摘した制限を回避する方法があれば、それも問題ありませんが、私は一週間の努力の後であきらめてしまいました。

ありがとうございました。

+0

、これを行うことができる唯一のことは、ASIOあるので、あなたはJAsioHostで行くことができますが、主にプロのサウンドハードウェアでASIOドライバとサウンドカードが必要になります。 –

+0

@JakubZaverkaはい、私はASIOを見ています。私はASIO4ALLドライバ(私の小型テストラップトップでも動作します)を見つけましたが、それでもインストールが複雑になりました。私はまた、新しいドライバーといくつかの奇妙な動作を見ている。私は、この複雑な問題がなければ、単純なフレーム位置の予測可能性/可観​​測性を好むでしょう。私は本当に低レイテンシを必要としません(それに対処するための一貫したレイテンシを測定する必要があります)が、再生中のオーディオにアプリケーションを同期させる必要があります。 – ags

答えて

0

私はそのようなライブラリが存在しないと思います...しかし、あなたが達成したいタスクは、ハード、実際にはありません:

あなたがオーディオフレームにアプリを同期する必要があります...オーディオを意味することは、マスター権限でありますタイミングで。再生のために定期的にサウンドのチャンクをポストし、チャンクxyが再生されているイベントを発行する新しいタイマーを作成することができます。

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

再生自体は、WindowsのWaveOut機能(link here、チュートリアルを検索できます)で行うことができます。これらの関数は、JNIを使​​用してJavaからアクセスできます。 WaveOutはWav形式のサウンドを再生します。つまり、簡単なLPCモジュレーションでデバイスを開き、生のサンプルをポストすることができます。

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

0

私はまだこれらのいずれかを試していないが、しかしに探して価値があるかもしれない:

  • http://xt-audio.com

  • そしてJitsiがwrap WASAPIにいくつかの作業を行っています。低レイテンシーのオーディオのこの種の

関連する問題