20

ユーザーモードから画像を渡し、ウェブカメラ出力として表示する仮想ウェブカメラドライバーを開発したいと考えています。

DirectX フィルターや CSourceStream などは使用したくありません。Web カメラの画像をキャプチャするために DirectX を使用しない一部のプログラムでは機能しないためです。

そのため、カーネル モードのデバイス ドライバーを作成する必要があります。

何か案は?DDK サンプルから testcap を試しましたが、ユーザー モードからの画像を処理せず、入力も得られず、ウェブカメラで 7 色を表示するだけです...

どんな助けでも大歓迎です。ありがとう


皆さん、ありがとうございました!

ここからコードを試しました: http://tmhare.mvps.org/downloads.htm (Capture Source Filter を見つけます)

Yahoo、MSN でコンパイルしたときは問題なく動作しましたが、AIM、Internet Explorer Flash Webcam、Firefox Flash Webcam、Skype ではクラッシュしました。これを 8 回呼び出した後、QueryInterface でクラッシュしました。たくさんのトリック..

HRESULT CVCamStream::QueryInterface(REFIID riid, void **ppv) への 8 回目の呼び出しでクラッシュすることがわかりました。

最後に達したときの 8 回目の呼び出し if、つまり: return CSourceStream::QueryInterface(riid, ppv);

Filters.cpp の 17 行目にあります。

なぜ私がクラッシュしていると思いますか??

ドライバーではなくDirectShowである正しい解決策を見つけるように私を導いてくれてありがとう

4

2 に答える 2

18

画像データへのアクセスを提供する Microsoft の API がいくつかあります。

  • Twain: スキャナーなどからの単一イメージのキャプチャーに使用されます。
  • WIA: これは単一の画像コーデック ライブラリに退化したようです。
  • VfW: 非常に古い (Win16) API で、実際には Video-File のエンコード/デコードのみを行いますが、一部のビデオ取得をサポートしています。
  • DirectShow: 以前は DirectX SDK に含まれていましたが、現在は Platform SDK に含まれています。これは、現在の (一般的な) ストリーミング ソリューションの場所です。
  • Windows Media/Media Foundation: これは、ビデオの再生/再エンコードを対象としているようです。
  • メーカー固有のライブラリ: Pylon/Halcon/Imaging Control/...

DirectShow固有:

Windows で画像取得デバイスを作成するには、streamclasses インターフェイス (または新しい Avstream) を実装するデバイス (ドライバー) を提供するか、VideoInputCategory 列挙子に追加する必要があるユーザーモード COM オブジェクトを作成する必要があります。

Avstream サンプルは、実画像取得デバイスのすべてを提供します。実際に欠落しているのは、実際のデバイスの下層だけです。

デバイスを設計できる場合は、DCAM または UVC 互換のデバイスを作成する必要があります。どちらの場合も、Windows によって提供される組み込みドライバーがあります。


ソフトウェアソースデバイスの書き方:

少なくとも 1 つの出力ピンを提供する DirectShow フィルターを作成し、これを VideoInputCategory の下に登録する必要があります。特定のアプリケーションがキャプチャ アプリケーションから必要とするインターフェイスがいくつかある場合がありますが、これらはアプリケーション自体に依存します。フィルターを試すための簡単なアプリケーションは、Plattform SDK で提供される GraphEdit と AMCap です。

いくつかのコード:

#include <InitGuid.h>
#include <streams.h>


const AMOVIESETUP_MEDIATYPE s_VideoPinType =
{
    &MEDIATYPE_Video,   // Major type
    &MEDIATYPE_NULL     // Minor type
};

const AMOVIESETUP_PIN s_VideoOutputPin =
{
    L"Output",              // Pin string name
    FALSE,                  // Is it rendered
    TRUE,                   // Is it an output
    FALSE,                  // Can we have none
    FALSE,                  // Can we have many
    &CLSID_NULL,            // Connects to filter
    NULL,                   // Connects to pin
    1,                      // Number of types
    &s_VideoPinType         // Pin details
};

const AMOVIESETUP_FILTER s_Filter =
{
    &CLSID_MyFilter,        // Filter CLSID
    L"bla",         // String name
    MERIT_DO_NOT_USE,               // Filter merit
    1,                              // Number pins
    &s_VideoOutputPin               // Pin details
};

    REGFILTER2 rf2;
    rf2.dwVersion = 1;
    rf2.dwMerit = MERIT_DO_NOT_USE;
    rf2.cPins = 1;
    rf2.rgPins = s_Filter.lpPin;

    HRESULT hr = pFilterMapper->RegisterFilter( CLSID_MyFilter, _FriendlyName.c_str(), 0, 
        &CLSID_VideoInputDeviceCategory, _InstanceID.c_str(), &rf2 );
    if( FAILED( hr ) )
    {
        return false;
    }

    std::wstring inputCat = GUIDToWString( CLSID_VideoInputDeviceCategory );
    std::wstring regPath = L"CLSID\\" + inputCat + L"\\Instance";
    win32_utils::CRegKey hKeyInstancesDir;
    LONG rval = openKey( HKEY_CLASSES_ROOT, regPath, KEY_WRITE, hKeyInstancesDir );
    if( rval == ERROR_SUCCESS )
    {
        win32_utils::CRegKey hKeyInstance;
        rval = createKey( hKeyInstancesDir, _InstanceID, KEY_WRITE, hKeyInstance );

        ....

_InstanceID は、この「仮想デバイス」エントリ用に作成された GUID です。

于 2009-10-26T22:30:48.530 に答える
4

他のプログラムがドライバーを呼び出す方法を決定することはできません。ほとんどのプログラムは DirectShow を使用します。win3.x テクノロジの VFW を使用する人もいます。Windows XP のスキャナやカメラ ウィザードを含む多くの新しいプログラムは、WIA インターフェイスを介してユーザーを呼び出します。これらすべてを実装したくない場合は、少なくともWDM 経由で DirectShow インターフェイスを提供し、vfwwdm32.dll で VFW インターフェイスを提供するか、独自の VFW ドライバーを作成する必要があります。

于 2009-10-26T21:56:30.843 に答える