1

DSPACK ライブラリを使用して DirectShow フィルタ処理を行う Delphi 6 Pro プログラムがあります。カスタム オーディオ ソースからオーディオを提供する最初のプッシュ ソース フィルターを作成しています。現在、私の最大の疑問は、FillBuffer() 呼び出し中にフィルターの出力バッファーにコピーするデータの量を決定する方法です。

一度に 1 つのオーディオ サンプルしかコピーできないのですか? 私の場合、各オーディオ サンプルは 16 ビット幅のシングル チャネルであるため、これはわずか 2 バイトになります。これは根本的に非効率に思えます。または、サンプルのブロックを一度にコピーする必要がありますか? もしそうなら、コピーするバイト数を決定する際に使用する正しいロジックは何ですか? Sample.GetSize() によって返された値を提供するバイト数として単純に使用する正しいロジックはありますか?ここで、Sample は FillBuffer() 呼び出しに渡された IMediaSample オブジェクトですか?

また、オーディオ プッシュ ソース フィルターとビデオ フィルターの作成に関するヒントや注意点があれば、ここに投稿してください。私が取り組んでいるサンプルは、現在のデスクトップ イメージを一連のビットマップとしてストリーミングするビデオ フィルターです。ビデオ フィルターを出発点として使用する場合、オーディオのみの DirectShow フィルターに不適切なことを行うのではないかと心配しています。さらに、このフィルタからのオーディオは、2 つのパーティ間のライブ オーディオ接続を伴うため、リアルタイムである必要があります。

4

1 に答える 1

1

一度に 1 つのオーディオ サンプルしかコピーできないのですか? 私の場合、各オーディオ サンプルは 16 ビット幅のシングル チャネルであるため、これはわずか 2 バイトになります。これは根本的に非効率に思えます。それとも、サンプルのブロックを一度にコピーしますか...

一度にブロックをコピーします。実際、アップストリーム/ソース フィルターがあるため、データを生成しているのはあなたです。したがって、フィルターは、出力ピンに接続されたメモリ アロケーターを要求して、データを運ぶための新しいバッファーを取得します。バッファを取得すると、その容量があります。たとえば、N バイトです。必要に応じてバッファを自由に埋めて、サンプルを入れたり、数バイトだけ入れたり、可能な限り入れたりすることができます。

複雑さを避けるために、メディア タイプに固有のブロック アラインメントでデータを埋める必要があります。オーディオでは、通常はWAVEFORMATEX::nBlockAlign価値があります。これを行わなくても、データを内部的にバッファリングし、アライメント自体を処理する特定のピア フィルターでは問題ない場合があります。また、アライメントが適切であれば、正しいタイム スタンプをデータに簡単に添付できます。

于 2011-10-25T20:47:15.360 に答える