2


私はそのサーバーでクライアント/サーバーアプリを作成しており、外部デバイス(マイクなど)からキャプチャされたオーディオサンプルをキャプチャしてクライアントに送信するライブオーディオデータを送信しています。次に、クライアントはそれらのサンプルを再生したいと考えています。私のアプリはローカル ネットワークで実行されるので、帯域幅に問題はありません (私のネット カードは 1000Mb ですが、私のサウンドは 8k、8 ビット ステレオです)。クライアントでは、データを短時間バッファリングしてから再生を開始します。サーバーからデータが到着すると、サウンドカードに送信します。これは問題なく動作しているように見えますが、問題があり
ます。クライアント側のバッファが終了すると、再生されたサウンドにギャップが発生します。
これは、サーバーとクライアントのサンプリング時間の違いによるものだと思います。つまり、サーバーの 8K とクライアントの 8K は同じではありません。
クライアントの再生とバッファを一時停止することでこれを解決できますが、適切な帯域幅があり、ギャップや一時停止なしでサウンドを再生できるはずなので、上司はそれを受け入れません。
そのため、クライアントで再生速度を動的に変更することにしましたが、方法がわかりません。

私は Windows (ネイティブ) でプログラミングしており、現在 waveOutXXX を使用してサウンドを再生しています。他のネイティブ ライブラリ (DirectX/DirectSound、Jack など) を使用できますが、クライアントでスムーズに再生できるはずです。

問題なく何度も waveOutXXX をプログラムしましたが、問題がないことはわかっていますが、動的リサンプリングの問題を解決できません。

4

2 に答える 2

1

あなたの問題は、サンプルレートの不一致によるものではなく、バッファリングに関係していると思われます. 継続的にデータをサウンド カードにダンプし、バッファを継続的に満たす必要があります。適切なバッファ サイズを使用してください...ほとんどのアプリケーションでは 300 ミリ秒で十分です。

現在、長期間にわたって、記録側のクロックと再生側のクロックが大きくずれて、300ms のバッファが十分ではなくなる可能性があります。アーティファクトが発生する可能性があるような小さな差でリサンプリングするのではなく、エンコードの最後にサンプルを追加することをお勧めします。それでも 8kHz で録音しますが、1 秒ごとに 1 つまたは 2 つのサンプルを追加して、8.001kHz 程度にすることもできます。このために既存のサンプルの 1 つを単純に 2 倍にしても (または 1 つのサンプルと次のサンプルの単純な平均でも) は聞こえません。アプリケーションの必要に応じてこれを調整します。

于 2012-08-08T14:39:39.933 に答える
1

私が取り組んでいたアプリケーションでも同様の問題がありました。ネットワークは関与しませんでしたが、特定の固定サンプリング レートでリアルタイムにキャプチャされるソース データ、大量の信号処理、および最終的に固定レートでのサウンド カードへの出力が必要でした。あなたと同じように、バッファ境界で再生にギャップがありました。

問題は、実行中の処理によって、オーディオ データが非常にぎくしゃくした方法でサウンド カードに送られることにあるように私には思えました。つまり、大きなチャンクを取得すると、別のチャンクを取得するまでに長い時間がかかります。全体的なスループットは適切でしたが、この遅延により、サウンド カードのデータが不足することがよくありました。システムのネットワーク部分で同じ状況が発生する可能性があると思います。

私がそれを解決した方法は、最初にオーディオバッファを長くすることでした。次に、新しいオーディオ チャンクを受信するたびに、バッファがどれだけいっぱいかをチェックしました。20% 未満の場合は、約 60% になるように無音を書き込みます。

実際にはギャップを追加しているので、これは再生のギャップを減らすことに反すると思うかもしれませんが、実際には役に立ちます。私が抱えていた問題は、非常に大きなオーディオ バッファーを持っていたにもかかわらず、常に空になる寸前だったことです。システム内の他のレイテンシーにより、ほぼすべてのバッファーで再生ギャップが発生しました。

バッファーが空になり始めたときにサイレンスを書き込むことで、実際に空になる前に、処理が少し遅れた場合にバッファーに常に予備のデータがあることを保証しました。また、多くの定期的なギャップに比べて、再生中のわずか 1 つの小さなギャップに気付くのは非常に困難です。

これがうまくいくかどうかはわかりませんが、実装して試すのは簡単なはずです。

于 2012-08-08T14:09:16.660 に答える