問題タブ [dspack]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
2799 参照

delphi - DirectShowフィルターチェーンの1秒の遅延をなくすにはどうすればよいですか?(DelphiとDSPACKを使用)

DSPACKコンポーネントライブラリを使用して、システムの優先オーディオ入力デバイスからSkypeにオーディオを送信するDelphi6Proアプリがあります。TSampleGrabberコンポーネントを使用して、フィルターグラフチェーンを利用し、オーディオバッファーをSkypeに送信しています。問題は、オーディオが1秒に1回しか取得されないことです。つまり、TSampleGrabberインスタンスのOnBuffer()イベントは、1秒に1回だけ発生し、Bufferパラメーターに1秒分のデータが含まれます。フィルタグラフチェーンを変更して、1秒に1回よりも速い間隔で入力デバイスからデータを取得する方法を知る必要があります。可能であれば、50ミリ秒ごとまたは少なくとも100ミリ秒ごとに実行したいと思います。

私のフィルターグラフチェーンは、上部にあるシステムの優先オーディオ入力デバイスにマップされているTFilterで構成されています。そのフィルターの出力ピンを、TFilterが割り当てられた「WAVDest」の入力ピンに接続して、PCMWAV形式でサンプルを取得できるようにします。次に、「WAV Dest」フィルターの出力ピンを、TSampleGrabberインスタンスの入力ピンに接続します。TSampleGrabber OnBuffer()イベントをより速い間隔で発生させるには、何を変更する必要がありますか?


更新:Roman Rの回答に基づいて、以下に示すソリューションを実装することができました。1つのメモ。彼のリンクから、ソリューションに役立つ次のブログ投稿にアクセスできました。

http://sid6581.wordpress.com/2006/10/09/minimizing-audio-capture-latency-in-directshow/

0 投票する
1 に答える
622 参照

delphi - オーディオのみを提供する DirectShow プッシュ ソース フィルターの正しいサンプル サイズは?

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

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

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

0 投票する
1 に答える
759 参照

delphi - プライベート別名未登録 DirectShow フィルターを適切に構築するにはどうすればよいですか (ソース コードがあります)。

Delphi 6 Pro と DSPACK DirectShow コンポーネント ライブラリを使用してプッシュ ソース フィルタを作成しました。フィルターをプライベートに使用したいので、DLL 用の AX ファイルを作成しません。代わりに、フィルターを直接作成したいと思います。これについていくつかのスレッドを見つけましたが、どちらもフィルターのコンストラクターを指定してプライベートフィルターを作成する方法を示していません。

以下は、未登録または非公開の DirectShow フィルターに関するスレッドです。

http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htm

http://www.progdigy.com/forums/viewtopic.php?p=12304&sid=df52f07f5b00d7ebfac12cb9b9bd9b54

DirectShow Push Source フィルタを EXE に直接埋め込むにはどうすればよいですか?

フィルタのソース コードは、私の Delphi プロジェクトに直接追加されています。しかし、メイン アプリケーションから直接フィルターを作成するときにどのコンストラクターを使用すればよいか、またコンストラクターのパラメーターに何を渡せばよいかわかりません。誰かが彼らがどうあるべきか教えてもらえますか?

また、最初のスレッドが上記のように Filter オブジェクトの参照カウントをインクリメントし、後でアプリケーションが終了したときに Release() を呼び出す必要がありますか? もしそうなら、これを行う最善の方法は何ですか? または、アプリケーションの終了時に Filter で Free を呼び出すことはできますか?

最後に、プライベート フィルターを使用する前に、CoInitialized() と CoUninitialize() を呼び出す必要がありますか?

UPDATE : DSPACK 派生フィルターの基本クラスである TBCSource のクラスとクラス階層コンストラクター チェーンをトレースすると、ObjNameパラメーターがフィルター名であり、Unkパラメーターがフィルターを所有するオブジェクトであることがわかります。私の現在の推測では、フィルターをソースから直接作成する正しい方法は、TPushSourceFilter という名前の TBCSource 派生クラスに、任意にフィルター名 'My Push Source Filter' が与えられた場合です。たとえば、次のようになります。

最初のコンストラクター パラメーターは、フィルターの登録に使用されるフィルター名です。つまり、GraphEdt などのツールで DirectShow フィルターを参照するときに表示される名前です。2 番目のパラメーターは、TBCUnknown という名前の祖先クラスの所有者データ フィールド (FOwner) に解決されるため、NIL にする必要があると思います。唯一の目的は、デリゲートの状況の場合にクエリを Filter オブジェクトに直接適用するのではなく、非 NIL の場合、基本クラスによって処理される QueryInterface() 呼び出しを所有者オブジェクトにリダイレクトすることです。この構築方法を進めて、うまくいくかどうかを確認します。

0 投票する
2 に答える
758 参照

delphi - DirectShowフィルターのEnumPinsメソッド(Delphi / DSPACK)でNULL ppPinsパラメーターを処理する正しい方法は?

Windows XP/32マシンでDSPACKDirectShowコンポーネントライブラリを使用してDelphi6で記述されたカスタムプッシュソースフィルターがあります。コーディング中に、アプリケーションのコンパイラオプションで範囲チェックをオンにした後、DSPACK(BaseClass.pas)に属するBaseClassユニットで範囲チェックエラーが発生するという問題が発生しました。

EnumPins()メソッド中にエラーが発生しています。このメソッドは、私のアプリケーションではなく、DSPACKのBaseClassユニットにあることに注意してください。問題を追跡し、フィルターを使用して作成したフィルターグラフがフィルターを再生するときに発生することを発見しました。私のフィルターは、外部AXとしてではなく、プライベートの未登録フィルターとしてアプリケーションに直接組み込まれていることに注意してください。DirectShowが基本クラスメソッドTBCEnumPins.Next()を呼び出すとき、ppPinsパラメーターがNILの場合その後、範囲チェックエラーが発生します。私はDirectShowの専門家ではないため、DirectShowピン列挙プロセスの適切なフローを妨げることなくこのエラーを修正する正しい方法がわかりません。代わりに、それが無視されるべきではない真のエラー状態である場合、スローする正しい例外またはこのイベントで返されるHRESULTコードが何であるかを知る必要があります。誰かがこのコードをNILppPinsパラメーターに合わせて調整する適切な方法を教えてもらえますか?完全なメソッドコードは、範囲チェックエラーが発生する行とともに以下に強調表示されています。

更新: DSPACKコードは技術的な観点からは健全であるように見えますが、コーディングイディオムの観点からは少し奇妙であり、範囲チェックと互換性のない方法で構造化されています。ppPins "out"パラメーターを介して入ってくるNILは、呼び出し元がppPinsパラメーターとしてTBCEnumPins.Next()に渡す宛先バッファーにマップされます。たとえば、以下のコードはこのページからのものです。

http://tanvon.wordpress.com/2008/09/07/enumerating-the-directshow-filter-pin/

そのページには、DirectShowフィルターと対話してフィルターのピンを列挙する次のコードがあります。

Next()メソッドに取得するピンの数を指示することにより、異常な動的配列キャストを含むTBCEnumPins.Next()メソッドコードは、ppPinsの「out」パラメーターにコピーするピンの数だけであるため、安全であることがわかります。 Next()関数の「cPins」パラメーターで要求されます。呼び出し元が「cPins」で要求されたピンの数を保持できる宛先バッファを通過する限り、すべてが正常に機能します(範囲チェックがオフになっている限り)。この場合、「outPin」という名前のIPin変数が宛先バッファーであることに注意してください。DelphiはNILを長さゼロの配列として扱うため、範囲チェックがオンになっていると、範囲チェックエラーが発生します。

0 投票する
1 に答える
422 参照

delphi - フィルターに永続的なローカル データがある場合、各 DirectShow フィルター インスタンスに一意のクラス ID が必要ですか?

Delphi 6 アプリケーションで個人的に使用するプッシュ ソース フィルタを作成しました。アプリケーションは、DSPACK DirectShow コンポーネント ライブラリを使用します。個人的には、外部 DLL ( .axファイル)にあるフィルターの代わりに、フィルターのインスタンスをフィルター グラフに直接追加するだけです。

作成するフィルターのインスタンスごとに一意のクラス ID (GUID) を作成する必要がありますか?それとも、作成したすべてのインスタンス間で同じクラス ID を使用しても安全ですか? Filter の各インスタンスは、Filter のキューに入れられたデータを保持するためのローカル データ ストレージ オブジェクトを作成するため、これについて心配しています。ローカル データ ストレージ オブジェクトは、ホスト アプリケーション内の他のコードによって書き込まれるため、プッシュ ソース フィルターを介してデータをフィルター グラフにプッシュします。

私の設計が安全かどうかを知るために、メソッド ポインターのルックアップがどのように行われるかを知るには、DirectShow については十分ではありません。フィルターのインスタンスをグラフに直接追加する場合、DirectShow は、フィルター グラフがオブジェクト参照またはクラス ID によって呼び出すインターフェイス メソッド ポインターを保存しますか? 前者の場合はすべて問題ありませんが、後者の場合、同じインスタンスがすべてのメソッド呼び出しを取得すると問題になる可能性があります。このデザインの質問に対する答えを知っている人はいますか?

0 投票する
3 に答える
1486 参照

delphi - QueryPinInfo によって返された ID であるにもかかわらず、名前/ID で DirectShow フィルターにピンが見つからない

DirectShow アプリケーションの開発中に奇妙な問題が発生しました。DSPACK DirectShow コンポーネント ライブラリで Delphi 6 を使用しています。IBaseFilter インスタンスの 1 つは、TPinInfo.achName プロパティ (_PinInfo) を使用してフィルター内のピンを見つけようとすると、所有するピンを認識しないようです。(この場合、この奇妙な動作を示しているのは、TSampleGrabber コンポーネントによって作成された IBaseFilter であることに注意してください)。

以下のコードサンプルにカプセル化された一連のイベントは次のとおりです。

  1. IBaseFilter インスタンスで最初に使用可能な入力ピンを見つけます。以下のコードでは、これは testPinInfo() に渡されるピンです。
  2. 返されたピンで QueryPinInfo() を実行して、その情報を取得します。返された情報は、ピンの achName を「入力」として示しています。
  3. IBaseFilter.findPin() を使用して、まったく同じ IBaseFilter インスタンスで「入力」という名前のピンを検索してみてください。
  4. その名前のピンが見つからなかったことを示す NIL を返します。私の意見では、これは本当に奇妙な状態 (エラー) です。

このシナリオを引き起こす可能性のある条件を知っている人はいますか? 関連するデータ構造は、デバッガーで調べると問題ないように見えるため、メモリ破損の問題ではないと思います。一部の IBaseFilter 実装が FindPin() メソッドの適切な実装を怠っている可能性はありますか?

以下にコードを示します。

0 投票する
1 に答える
2315 参照

delphi - キャプチャフィルターでのDirectShowput_Enable呼び出し中に不特定のエラー($ 80004005)をデバッグするにはどうすればよいですか?

DSPACKコンポーネントライブラリを使用してDelphi6で記述されたDirectShowアプリケーションがあります。フィルタで入力行を有効にするという奇妙な問題が発生しています。入力行(この場合は「マイク」という名前)が見つかるまでピンを検索し、フィルターグラフがアクティブなときにput_Enable(true)を呼び出します。これを行うと、HRESULTとして$80004005の「不特定のエラー」が発生します。

入力ラインを有効にする前に、フィルターの出力オーディオメディアタイプを設定していますが、何かが正しく機能していません。アプリケーションを作成するために使用した元のDirectShowサンプルは正常に機能します。フィルタグラフを作成するのとまったく同じ手順を実行していると思います。もちろん、何かを見逃した可能性があります。この問題を解決するために私が試みることができることについて誰かが何かヒントやアイデアを持っていますか?以下のコードスニペットは、私が行っていることを部分的に示していますが、非常に長いため、それに至るまでのすべてのステップではありません。私がテストに使用しているキャプチャデバイスは、「マイク」という名前の単一の入力ラインを備えたVOIPヘッドセットです。

0 投票する
1 に答える
1594 参照

delphi - DirectShow の「中間フィルターの組み合わせが見つかりませんでした」エラーのその他の原因は?

DSPACK DirectShow コンポーネント ライブラリを使用する Delphi 6 アプリケーションがあります。現在、オーディオ キャプチャ デバイスのキャプチャ ピンを別のフィルタの入力ピンに接続しようとすると、「中間フィルタの組み合わせが見つかりませんでした」というエラーが表示されます。メディア形式を正しく設定していると思いますエラー トラップがあり、そのトラップで、不一致がある場合に備えて、設定されている正確なメディア フォーマットを両方のピンに明示的にクエリします。これを行うと、両方のピンがまったく同じ WAV 形式で返されます。

フォーマットタグ: 1

チャネル数: 1

サンプルあたりのビット数: 16

サンプルレート: 8000

これは、両方のフィルターを設定したものと一致しますが、(通常、私が知る限り) 形式の非互換性を示すエラーが発生します。以前にこのエラーに遭遇し、私が間違っている可能性があることや、他にどのようなテスト/検査を行うことができるかを知っている人はいますか?

0 投票する
1 に答える
155 参照

delphi - 「古い」DirectShowインターフェース参照から保護する自動方法はありますか?

DSPACKコンポーネントライブラリを使用するDelphi6DirectShowアプリケーションの「古い」インターフェイス参照が原因で長いデバッグセッションが発生しました。ご存知のように、フィルターグラフがアクティブなときに実行する必要のある操作と、フィルターグラフを非アクティブにする必要があるときにコンポーネントパラメーターに対して実行する必要のある操作があります。問題は、初期化された値(NILではなく割り当てられた)を保持しているが、フィルターグラフの前のインカネーション中に作成されたため、現在のフィルターグラフのインカネーションには無効なDirectShowインターフェイス参照になってしまう可能性があることです。これは、フィルターグラフのオンとオフを切り替えて、「ライブ」検出操作とオフライン構成操作を切り替えるときに、偶然に行うのはそれほど難しくありません。

たとえば、フィルターグラフを最初にアクティブ化したときに割り当てたIBaseFilter参照を、フィルターグラフを非アクティブ化および再アクティブ化した後に再利用しようとしたとします。インターフェース参照は、フィルターグラフの現在の化身ではなく、前の化身に属しているため、「古くなった」状態になりました。これにより、あらゆる種類の奇妙で直感的でないDirectShowエラーメッセージが表示されますが、実際にはインターフェイス参照が古くなっていることが原因です。

慣例によるか、フィルターグラフの存続期間に関連付けられたDirectShowスマートポインターなどの巧妙なソリューションによるかを問わず、これを防ぐ方法を誰かが思いついたことがありますか?それとも、インターフェース参照の使用に執拗に注意する唯一の解決策ですか?

0 投票する
1 に答える
511 参照

delphi - まったく同じ形式のオーディオを一緒にミックスできる単純なDirectShowフィルターはありますか?

DSPACKコンポーネントライブラリを使用してDelphi6で記述されたDirectShowアプリケーションがあります。まったく同じメディア形式に設定されている複数のキャプチャフィルターからの出力ピンからのオーディオをミックスできるようにしたいと思います。これを行うオープンソースまたは「SDKサンプル」フィルターはありますか?

インテリジェントなミキシングは重要であり、それを行うには商用ライブラリを購入する必要がある可能性が高いことを私は知っています。しかし、必要なのは、複数の出力ピンからのウェーブオーディオ入力を受け入れ、受信したサンプルを直接追加できるDirectShowフィルターだけです。単一のストリームを複数のストリーム(1対多)に分割するためのTee Filterがあることは知っていますが、逆の(多対1)ことを行うものが必要です。できれば、入力接続の試行ごとにフォーマットをチェックして、すでに追加されているものとは異なるメディアフォーマットで出力ピンを接続しようとすると、エラーが発生します。何かありますか?