2012-01-12 2 views
1

私は、DSPACKコンポーネントライブラリで構築された私のDelphi 6アプリケーションにDirectShowフィルタグラフを持っています。次のようにグラフの構造は次のとおりです。DirectShowフィルタグラフにレンダラを追加すると、オーディオ入力がグラフに滑らかに表示されるのはなぜですか?

  • カスタムプッシュソースオーディオフィルタ
  • サンプルグラバー
  • ティーフィルター(私はWAVファイルのライターとレンダラの両方をオンにしたときのみ)
  • レンダラー(有利なPCの出力デバイス)
  • WAVファイルライターは

ティーフィルターは、私がを持っている場合にのみ、グラフに追加されますレンダラーとWAVファイルライターフィルターが両方ともオンになっています。それ以外の場合は、であるフィルタのみを直接サンプルグラバに接続します。

オーディオは、リアルタイムでストリーミングオーディオであるWiFi接続のRTSPオーディオサーバーで配信されています。 がWavファイルライタをオンにしていないと、ヘッドフォンから出力される音声に、典型的なポンピングとバッファリングされていないオーディオストリームに関連するクリック音があります。奇妙なことに、WAVファイルライターフィルターをオンにすると、オーディオはガラスのように滑らかになります。

私はWAVファイルライターのソースコードを持っており、必要なときに適切なWAVファイルヘッダーを出力し、必要以上にオーディオバッファを書き込むというタスクを基本的に処理します。だから、私はそれをオンにすることは、特にそれがレンダラ(フィルタ)の上流ではなく、レンダラと一緒にティーフィルタの終わりにぶら下がっているピアフィルタであるため、着信オーディオストリームをスムーズにするのが奇妙なことがわかります。

File Writerフィルタをオンにしたときに、オーディオ配信をスムーズにするために何が起こっているか教えていただけますか?ティーフィルタは固有のバッファリングを行いますか?私は、File Writerがオンになっていないときにスムーズなオーディオができるように、同じメカニズムを複製したいと思います。私は私が持っているよりもリアルタイムのオーディオストリームにそれ以上の遅延を加えたくないので、私自身のバッファリングを追加することを避けようとしています。

+0

おそらく本当の質問は、オーディオが最初に不鮮明だった理由でしょう。オーディオレンダラーの統計情報はあなたにヒントを与えることができます。 –

答えて

2

ライブソースがあり、同時にそれを聞くことができ、同時に配信されたオーディオを聞くことができる場合は、ファイルライターを追加すると遅延が発生するかどうかを知ることができます。または、サイズが変更されたか、または交渉されたバッファの数がDecideBufferSizeにある可能性があります。

メディアサンプルのタイムスタンプにオフセットを追加するなど、プッシュフィルタに明示的なバッファリングを導入することをお勧めします。 Teeフィルタ内の固有のバッファリングは信頼できない場合があります。納期の変動は避けられません。

より洗練されたアプローチでは、バッファリングを最小限に抑えるか、またはバッファリングを必要としない場合は、ピッチを維持しながらオーディオをストレッチ/圧縮することができます。

+0

興味深い「ストレッチ/コンプレッション」アイデアについて詳しく説明できますか?私はそのコンセプトを理解している。私はそれがオーディオ編集プログラムで行われているのを見ました。しかし、私はそれを実行することで節約するほどの遅延を導入することなく、リアルタイムのストリームでどのようにそれをどのように実装するのかは分かりません。また、時間短縮アルゴリズムのための優れたオープンソース実装について知っていれば教えてください。 –

+1

私は主要なメディアプレーヤーの1人にこのアプローチについて言及しましたが、正確には覚えていませんが、実装方法を推測できるだけです。その適用性は、小さなバッファ時間(標準は少なくとも3〜5秒)、信頼できる/低い待ち時間のネットワーク、再生速度の最大で5〜6%の変動という、以下の要件/制約によって制限される可能性がある。 [SoundTouch](http://www.surina.net/soundtouch)ライブラリを使用してオーディオをストレッチすることができます。処理オーバーヘッドはほとんどなく、リアルタイムで行うことができます。 –

関連する問題