web-dev-qa-db-ja.com

ネットワークを介したオーディオの同期

私は、ネットワークを介して任意にオーディオをストリーミングできるクライアント/サーバーオーディオシステムの設計に着手しています。 1つの中央サーバーがオーディオストリームを送り出し、x個のクライアントがオーディオデータを受信して​​再生します。これまでのところ、魔法は必要ありません。このシナリオでは、VLCメディアプレーヤーをそのまま使用できます。

ただし、トリッキーな部分は、オーディオ再生を同期してすべてのクライアントが可聴同期しているようです(実際の遅延は、人間のリスナーによって同期していると認識されている限り許可されます)。

私の質問はこのタイプの同期の問題に使用する既知の方法またはアルゴリズムがあるかどうかです(ビデオはおそらく同じ方法で解決されます)。私自身の最初の考えは、物理マシン間でクロックを同期させ、それによって仮想的な「メインタイマー」を作成し、それに何らかの形でオーディオデータパケットを揃えることを中心にしています。

一部の製品は既に問題を解決しています(ただし、私の全体的なユースケースにはまだ十分ではありません)。

http://www.sonos.com

http://netchorus.com/

どんなポインタでも大歓迎です。ありがとう。

PS: この関連質問 はずっと前に亡くなっているようです。

43
sharkin

Ryan Barrettが調査結果を 彼のブログ に書いた。

彼の解決策は、すべてのクロックを同期させる方法として [〜#〜] ntp [〜#〜] を使用することを含みました:

しかし真剣に、p4syncには1つのトリックしかありません。それがNTPの使用方法です。 1つのホストがp4syncサーバーとして機能します。他のp4syncクライアントは、SNTPを使用して、システムクロックをサーバーのクロックに同期させます。サーバーが曲の再生を開始すると、ミリ秒までの時間を記録します。次に、クライアントはそのタイムスタンプを取得し、そのタイムスタンプから現在の時刻の差を計算し、それを曲のはるか先までシークします。

31
Kevin Panko

難しい問題ですが、可能です。

NTPまたは tictoc を使用して、システムのタイムソースに関して既知のレートで同期クロックを取得します。

また、サウンドクロックのレートに関して推定器を実行し続けます。これを行う通常の方法は、再生中の同じサウンドデバイスで録音し、マジックナンバーがプリロードされたバッファに録音し、同期クロックによって測定された時間内にサウンドカードが到達する場所を確認します(またはその逆、既知の数のサンプルを同期クロックで実行するのにかかる時間)。あなたはこれをし続ける必要があります、時計はネットワーク時間に対して相対的にずれます。

これで、同期したクロックのレートに一致させるために出力する必要がある、サウンドカードのクロックによる1秒あたりのサンプル数が正確にわかりました。したがって、ネットワークから受信したサンプルをそのレートで補間します。最後のバッファーに到達したところから少し遅れて追いつく、またはフォールバックする必要がある場合は、補正をプラスまたはマイナスします。オーディオのアーティファクトが発生しないようにこの補間を行うには、細心の注意が必要です。必要なアルゴリズムのサンプルコード here がありますが、それに慣れる前に、かなりの読み物になるでしょう。

もちろん、ソースがライブ録音の場合は、そのサウンドカードのサンプルレートを測定し、送信する前にネットワーク時間サンプルに内挿する必要があります。

10
Andrew McGregor

Microsoft ResearchのTom Blankによる論文 An Internet Protocol Sound System を確認してください。彼はあなたが取り組んでいる正確な問題を解決します。彼のソリューションには、マシン間でクロックを同期させ、タイムスタンプを使用してそれぞれを同時に再生させることが含まれます。このアプローチの欠点は、レイテンシです。すべてのクロックを同期させるには、ネットワークで最大の待ち時間で時刻をスタンプする必要があります。

10
Steve Rowe

会場のサイズと形状に応じて、すべてをbeに同期させることは簡単な部分ですが、すべてをsound正しい状態にすることは、可能であればそれ自体がアート形式です。まったく。技術面で最も難しいのは、同期したタイムラインから実際のサウンド出力までの遅延を見つけることです。同一のハードウェアと低遅延のソフトウェアフレームワーク(ASIO、JACK)があることは、キャリブレーションと同様に、確かに役立ちます。事前またはアクティブのいずれか。それ以外の場合は、タイムラインをNTP=)と同期させ、オーディオピッチへの閉ループフィードバックを使用して、合意されたタイムラインに出力を同期させます。

より大きな問題は、音が伝播するのにかなりの時間がかかることです。 10mの距離の差はすでに30msの遅延です-音の定位を台無しにするのに十分です。それを2倍にすると、迷惑なエコー領域に入ります。プロのオーディオセットアップは、意図的に遅延を導入し、より多くのツイーターを使用し、残響を再生して、リスナーを疲れさせるエコーの不協和音を回避します。

7
Ants Aasma

「...人間のリスナーによって同期していると認識されている限り」-耳は目より寛容ではないため、実行するのは非常に困難です。特に、ワ​​イヤレスネットワーク経由でこれを実行する場合。

最初に、Webベースのテクノロジー、JavaScriptを介してサーバーによってリモート制御されるフラッシュオーディオプレーヤーを試します。

それが悪い結果を与えたなら、私はpython(pygameで)のようなものを使用してより多くの制御を得ようとするでしょう。

進歩があったなら、私も ChucK を使ってみて、ALSAオーディオライブラリで低レベルのプログラミングを試してみます。

満足のいく結果が出ない場合は、この投稿に戻って実際にエキスパートオーディオプログラミングの第一人者が理にかなっているものを読み、私の生計がそれに依存している場合、おそらく商用のNetChorusアプリケーションまたは同様の何かのために14ポンドをフォークすることになります。

0
zaf