Windows ストア デバイス アプリ用のカメラ ドライバー MFT の作成

Windows 8.1 対応の Windows ストア デバイス アプリを使うと、カメラ ドライバー MFT (メディア ファンデーション トランスフォーム) により、カスタム設定と特殊効果をカメラのビデオ ストリームに適用できます。このトピックでは、Driver MFT を紹介し、Driver MFT のサンプルを使ってその作成方法を示します。Windows ストア デバイス アプリ全般について詳しくは、「Windows ストア デバイス アプリについて」をご覧ください。

Driver MFT

ここでは、カメラから取得したメディア キャプチャ ストリームに効果を適用するために作る Media Foundation Transform (MFT) について説明します。MFT とは、カメラを他のカメラと実際に区別するカラー エフェクト、スキーム モード、顔追跡効果の変換を提供する方法です。この MFT は Driver MFT とも呼ばれ、Windows ストア アプリがビデオのキャプチャを開始するときに、カメラ ドライバーから取得する接続済みのビデオ ストリームに最初に適用されます。 そのアプリで [カメラのオプション] UI を呼び出すと、Driver MFT がカスタム効果を制御するために実装するインターフェイスへのアクセスが Windows によって自動的に提供されます。

カメラ ドライバー MFT を使うと、Windows ストア デバイス アプリでカスタム効果を提供できます。

Windows ストア デバイス アプリでは、Driver MFT は必須ではありません。デバイスの製造元は、Driver MFT を使わずに Windows ストア デバイス アプリを実装し、ビデオ ストリームにカスタム設定と特殊効果を適用せずに、単にハードウェアのブランドを含んでいる差別化したユーザー インターフェイスを提供することができます。

Driver MFT の使い方

カメラ用 Windows ストア デバイス アプリは、CameraCaptureUI API からプロセスを呼び出す Windows ストア アプリとは別のプロセスで実行されます。Windows ストア デバイス アプリで Driver MFT を管理するには、さまざまなプロセス空間で特定のイベント群が発生することが必要です。

  1. Windows ストア アプリで写真をキャプチャする必要がある場合、CaptureFileAsync メソッドを呼び出します。
  2. Windows は、Driver MFT ポインターとカメラのデバイス ID を要求します。
  3. Driver MFT ポインターが設定ホストに渡されます。
  4. ホストは、カメラに (デバイス メタデータごとに) 関連付けられている Windows ストア デバイス アプリのアプリ ID をデバイス プロパティで照会します。
  5. Windows ストア デバイス アプリが見つからない場合は、既定のポップアップがキャプチャ エンジンと通信します。
  6. Windows ストア デバイス アプリが見つかった場合は、そのアプリがアクティブ化され、設定ホストからアプリに Driver MFT ポインターが渡されます。
  7. Windows ストア デバイス アプリは、そのポインターを介して公開されるインターフェイスを使って Driver MFT を制御します。

Windows ストア デバイス アプリを起動するプロセスの相互作用。

AvStream ドライバー モデルの要件

カメラのドライバーは、AvStream ドライバー モデルを使う必要があります。AVStream ドライバー モデルについて詳しくは、AVStream ミニドライバーの設計ガイドに関するページをご覧ください。

Driver MFT をアプリに公開する方法

Driver MFT は Windows に COM インターフェイスとして登録されるため、Driver MFT によって実装される変換はカメラなどの特定のデバイスから取得するメディア ストリームに適用できます。

  MFTRegister 関数はデバイスに固有のものであって、汎用目的の MFT ではないため、この関数を使って Driver MFT を登録しないでください。レジストリ キーについて詳しくは、このトピックの「Driver MFT のインストールと登録」をご覧ください。

アプリがビデオ キャプチャを開始するとき、メディア ファンデーション ソース リーダーがビデオ ストリームを提供するためにインスタンス化されます。このメディア ソースは、デバイスのレジストリ キーからレジストリ値を読み取ります。Driver MFT の COM クラスの CLSID がレジストリ値に見つかると、ソース リーダーによって Driver MFT がインスタンス化され、メディア パイプラインに挿入されます。

Windows ストア デバイス アプリ以外に Driver MFT 機能にアクセスできるのは、関連付けられたデバイスが次の API を使ってビデオをキャプチャするために使われている場合です。

  • HTML を使った Windows ストア アプリの HTML5 <video> タグ。Driver MFT で有効になっている変換は、次のコード例のように、<video> 要素を使って再生されているビデオに影響します。

    
    var video = document.getElementById('myvideo');
            video.src = URL.createObjectURL(fileItem);
            video.play();
    
    
    
  • Windows ランタイムを使った Windows ストア アプリの Windows.Media.MediaCapture API。この API の使い方について詳しくは、メディア キャプチャのサンプルに関するページをご覧ください。

  • メディア データを処理するアプリ向けの メディア ファンデーション ソース リーダー。Driver MFT は、IMFSourceReaderEx::GetTransformForStream を呼び出すと、最初 (0 番目) の MFT としてアプリに公開されます。返されるカテゴリは、MFT_CATEGORY_VIDEO_EFFECT です。

    メディア キャプチャでのソース リーダーの役割。

複数ピンのカメラ

3 ピンのカメラまたは他の複数ピンのカメラがある場合は、「複数ピンのカメラでの Driver MFT の考慮事項」をご覧ください。

Driver MFT の実装

ここでは、Driver MFT の実装について説明します。 Windows ストア デバイス アプリと連動する Driver MFT の完全な例については、Driver MFT のサンプルをご覧ください。

開発ツール

Microsoft Visual Studio Professional 2013 または Microsoft Visual Studio Ultimate 2013 が必要です。

Driver MFT の特性

Driver MFT はストリームごとにインスタンス化されます。カメラでサポートされているストリームごとに、MFT のインスタンスがインスタンス化され、そのストリームに接続されます。 Driver MFT には 1 つの入力ストリームと 1 つの出力ストリームが必要です。 Driver MFT は同期 MFT または非同期 MFT にすることができます。

カメラと Driver MFT 間の通信

メディア ソースと Driver MFT 間の双方向通信を有効にするため、ソース ストリームの属性ストアへのポインターが Driver MFT の入力ストリーム属性ストアに MFT_CONNECTED_STREAM_ATTRIBUTE として設定されます。これは、次の例に示すように、Driver MFT で MFT_ENUM_HARDWARE_URL_Attribute を公開することによって有効にするハンドシェイク プロセスを通じて行います。


HRESULT CDriverMft::GetAttributes(IMFAttributes** ppAttributes)
{
    HRESULT hr = S_OK;
    if (NULL == ppAttributes)
    {
       return E_POINTER; 
    };
        if(!m_pGlobalAttributes) {
           MFCreateAttributes(&m_pGlobalAttributes, 1);
           m_pGlobalAttributes-> 
             SetString(MFT_ENUM_HARDWARE_URL_Attribute, L"driverMFT");
        }
        *ppAttributes = m_pGlobalAttributes;
        (*ppAttributes)->AddRef();
        return S_OK;
}


この例では、Driver MFT の属性ストアの MFT_CONNECTED_STREAM_ATTRIBUTE は、デバイス ソース ストリームの属性ストアを指すように設定されます。カメラと MFT 間の通信を確立する方法について詳しくは、ハードウェアのハンドシェイク シーケンスに関するページをご覧ください。

デバイス ソース情報にアクセスする方法

次のコード例は、Driver MFT が入力属性ストアからソース変換へのポインターを取得する方法を示しています。ポインターを取得したら、Driver MFT はソース ポインターを使ってデバイス ソース情報を取得できます。


if(!m_pSourceTransform && m_pInputAttributes) {
          
          m_pInputAttributes->
              GetUnknown( MFT_CONNECTED_STREAM_ATTRIBUTE,
              IID_PPV_ARGS(&pSourceAttributes));
          pSourceAttributes-> 
              GetUnknown(
              MF_DEVICESTREAM_EXTENSION_PLUGIN_CONNECTION_POINT,            
              IID_PPV_ARGS(&pUnk)));
          pUnk->QueryInterface(__uuidof(IMFTransform), 
              (void**)&m_pSourceTransform));
      }
      if (m_pSourceTransform) {
         // Put code to get device source information here.         
      }


パススルー モードを実装する方法

Driver MFT をパススルー モードにするには、入力ストリームと出力ストリームに同じメディアの種類を指定します。その場合でも、MFT では ProcessInputProcessOutput が呼び出されます。Driver MFT の実装によって、処理がパススルー モードで行われるかどうかが判断されます。

含めるヘッダー ファイル

Driver MFT で実装する必要のある IInspectable メソッドと IMFTransform メソッドのヘッダー ファイルを含める必要があります。 含めるヘッダー ファイルの一覧については、カメラ用 Windows ストア デバイス アプリのサンプルSampleMFT0 ディレクトリ内の stdafx.h をご覧ください。


// required for IInspectable
#include <inspectable.h>


IInspectable を実装する方法

カメラの Windows ストア デバイス アプリから使うことを目的としている Driver MFT では、IInspectable のメソッドを実装して、Windows ストア デバイス アプリが起動時に Driver MFT へのポインターにアクセスできるようにする必要があります。Driver MFT は、次のように IInspectable のメソッドを実装する必要があります。

  • IInspectable::GetIids は、iids 出力パラメーターで null を返し、iidCount 出力パラメーターで 0 を返す必要があります。

  • IInspectable::GetRuntimeClassName は出力パラメーターで null を返す必要があります。

  • IInspectable::GetRuntiGetTrustLevel は出力パラメーターで TrustLevel::BaseTrust を返す必要があります。

次のコード例は、Driver MFT のサンプルに IInspectable メソッドを実装する方法を示しています。このコードは、サンプルの SampleMFT0 ディレクトリ内の Mft0.cpp ファイルに含まれています。


// Mft0.cpp
STDMETHODIMP CMft0::GetIids( 
    /* [out] */ __RPC__out ULONG *iidCount,
    /* [size_is][size_is][out] */ __RPC__deref_out_ecount_full_opt(*iidCount) IID **iids)
{
    HRESULT hr = S_OK;
    do {
        CHK_NULL_PTR_BRK(iidCount);
        CHK_NULL_PTR_BRK(iids);
        *iids = NULL;
        *iidCount = 0;
    } while (FALSE);

    return hr;
}

STDMETHODIMP CMft0::GetRuntimeClassName( 
    /* [out] */ __RPC__deref_out_opt HSTRING *className)
{
    HRESULT hr = S_OK;
    do {
        CHK_NULL_PTR_BRK(className);
        *className = NULL;
    } while (FALSE);

    return hr;
}

STDMETHODIMP CMft0::GetTrustLevel( 
    /* [out] */ __RPC__out TrustLevel *trustLevel)
{
    HRESULT hr = S_OK;
    do {
        CHK_NULL_PTR_BRK(trustLevel);
        *trustLevel = TrustLevel::BaseTrust;
    } while (FALSE);

    return hr;
}


COM の実装

Driver MFT で実装する各インターフェイスは、カメラの Windows ストア デバイス アプリに適切にマーシャリングされるように、IUnknown から実装および派生する必要があります。この方法を示す Driver MFT の .idl ファイルの例を次に示します。


// SampleMft0.idl : IDL source for SampleMft0
//

// This file will be processed by the MIDL tool to
// produce the type library (SampleMft0.tlb) and marshalling code.

import "oaidl.idl";
import "ocidl.idl";
import "Inspectable.idl";
import "mftransform.idl";
[
    object,
    uuid(F5208B72-A37A-457E-A309-AE3060780E21),
    oleautomation,
    nonextensible,
    pointer_default(unique)
]
interface IMft0 : IUnknown{
    [id(1)] HRESULT UpdateDsp([in] UINT32 uiPercentOfScreen);
    [id(2)] HRESULT Enable(void);
    [id(3)] HRESULT Disable(void);
    [id(4)] HRESULT GetDspSetting([out] UINT* puiPercentOfScreen, [out] BOOL* pIsEnabled);
};
[
    uuid(DE05674A-C564-4C0E-9B7C-E1519F7AA767),
    version(1.0),
]
library SampleMft0Lib
{
    importlib("stdole2.tlb");
    [
        uuid(7BB640D9-33A4-4759-B290-F41A31DCF848)		
    ]
    coclass Mft0
    {
        [default] interface IMft0;
        interface IInspectable;
        interface IMFTransform;
    };
};


  Driver MFT は、CoCreateInstance を使って作成できる通常の COM クラスです。汎用の MFT ではないため、登録する際に MFTRegister 関数を使わないでください。

プロキシの作成

Driver MFT はアウトプロセス サーバーです。Windows ストア デバイス アプリで使うには、プロキシでマーシャリングをサポートして、Driver MFT インターフェイスをプロセス境界を越えて使用できるようにする必要があります。この例は、Driver MFT のサンプルに関するページにあります。サンプルでは、MIDL コンパイラを使ってスタブレス プロキシを生成します。

Driver MFT をアプリに公開する

C# または JavaScript で、Driver MFT とやり取りする Windows ストア デバイス アプリを作るには、Windows ストア デバイス アプリの Microsoft Visual Studio プロジェクトに追加コンポーネントを作る必要があります。このコンポーネントは、Windows ストア デバイス アプリに表示できる Windows ランタイム コンポーネントに Driver MFT インターフェイスを公開するラッパーです。

カメラ用 Windows ストア デバイス アプリのサンプルに含まれている Wrapper サブプロジェクトでは、Windows ランタイムに Driver MFT を公開する方法の例を示しているため、C# または JavaScript で実装されている Windows ストア デバイス アプリからそれを使うことができます。これは、Driver MFT のサンプルと連携するように作られています。サンプルのインストール、実行、テストに関する手順ガイドについては、Driver MFT のサンプルに関するページをご覧ください。

Driver MFT のインストールと登録

ここでは、Driver MFT のインストール手順を示します。

  1. Driver MFT DLL は、次のいずれかの場所のサブディレクトリにインストールする必要があります。
    • %SystemDrive%\Program Files\
    • %SystemDrive%\Program Files (x86)\
  2. x86 と x64 の両方のバージョンの DLL を x64 システムにインストールします。
  3. Driver MFT DLL で regsvr32 を呼び出すか、インストーラーが登録に使う DLL 用のドライバー マニフェスト (.man) ファイルを提供することによって、カメラのインストーラーが Driver MFT を登録します。
  4. カメラのレジストリ キーに CameraPostProcessingPluginCLSID 値を設定します。INF ファイルでは、デバイスのデバイス クラス レジストリ キーに Driver MFT の CLSID を指定する必要があります。これを行うには、Driver MFT クラスの CLSID GUID に CameraPostProcessingPluginCLSID 値を設定します。カメラ用のレジストリ キーを設定する INF ファイル エントリの例を次に示します。
    
    KSCATEGORY_VIDEO_CAMERA:
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{E5323777-F976-4f5b-9B55-B94699C46E44}\##?#USB#VID_045E&PID_075D&MI_00#8&23C3DB65&0&0000#{E5323777-F976-4f5b-9B55-B94699C46E44}\#GLOBAL\Device Parameters]
    "CLSID"="{17CCA71B-ECD7-11D0-B908-00A0C9223196}"
    "FriendlyName"="USB Video Device"
    "RTCFlags"=dword:00000010
    "CameraPostProcessingPluginCLSID"="{3456A71B-ECD7-11D0-B908-00A0C9223196}" 
    
    
    KSCATEGORY_CAPTURE:
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{ 65E8773D-8F56-11D0-A3B9-00A0C9223196}\##?#USB#VID_045E&PID_075D&MI_00#8&23C3DB65&0&0000#{65E8773D-8F56-11D0-A3B9-00A0C9223196}\#GLOBAL\Device Parameters]
    "CLSID"="{17CCA71B-ECD7-11D0-B908-00A0C9223196}"
    "FriendlyName"="USB Video Device"
    "RTCFlags"=dword:00000010
    "CameraPostProcessingPluginCLSID"="{3456A71B-ECD7-11D0-B908-00A0C9223196}"
    
    
    

      カメラに対しては、KSCATEGORY_VIDEO_CAMERA をお勧めします。デバイスの登録方法によって異なりますが、通常はレジストリ キーのいずれか 1 つのみが必要です。

アプリへのカメラの関連付け

ここでは、デバイス メタデータと Windows レジストリでカメラを識別するために必要な手順について説明します。このメタデータを使うと、Windows ストア デバイス アプリを関連付けることができ、カメラを初めて接続したときにシームレスにダウンロードできるようにアプリを識別します。

更新プログラム

アプリを最初にインストールした後で、ユーザーが更新されたバージョンのアプリをダウンロードした場合、更新プログラムがカメラ キャプチャ エクスペリエンスに自動的に統合されます。 ただし、更新プログラムは自動的にはダウンロードされません。アプリが自動的にインストールされるのは初回接続時のみのため、ユーザーは Windows ストアから追加のアプリの更新プログラムをダウンロードする必要があります。Windows ストア デバイス アプリのメイン ページでは、更新プログラムが利用可能であることを通知し、更新プログラムをダウンロードするためのリンクを提供できます。

重要  更新後のアプリは、Windows Update で配布される更新されたドライバーで動作する必要があります。

複数のカメラ

複数のカメラ モデルでは、デバイス メタデータで同じ Windows ストア デバイス アプリを宣言できます。 システムに複数の内蔵カメラがある場合は、それらのカメラで同じ Windows ストア デバイス アプリを共有する必要があります。アプリには、使用中のカメラを特定するロジックが含まれているため、[その他のオプション] エクスペリエンスにはカメラごとに異なる UI を表示できます。エクスペリエンスのカスタマイズについて詳しくは、「カメラのオプションをカスタマイズする方法」をご覧ください。

内蔵カメラ

内蔵カメラ用の Windows ストア デバイス アプリは Windows ストアから自動的にインストールすることはできませんが、最もシームレスなユーザー エクスペリエンスを確保するためにプリインストールすることをお勧めします。内蔵カメラをサポートし、Windows ストア デバイス アプリと内蔵カメラを関連付けるには、追加の手順が必要です。詳しくは、「内蔵カメラの位置の特定」をご覧ください。

デバイス メタデータ パッケージの作成

内蔵カメラでも外付けカメラでも、デバイス メタデータ パッケージを作る必要があります。カメラの Windows ストア デバイス アプリを Windows ストアに申請するとき (または、内蔵カメラの場合に OPK を使ってカメラの Metro スタイル デバイス アプリをプレインストールするとき)、アプリケーション自体に加えて、次の項目を含むメタデータを提供する必要があります。

  • アプリケーションの発行元名
  • アプリケーションのパッケージ名
  • アプリケーションの要素 ID
  • デバイス エクスペリエンス識別子

デバイス メタデータを使ってアプリをデバイスに関連付ける方法については詳しくは、「Windows ストア デバイス アプリの構築」をご覧ください。

関連トピック

Windows ストア デバイス アプリの構築
Windows ストア デバイス アプリの自動インストール
ハードウェアのハンドシェイク シーケンス (ハードウェア MFT) に関するページ
AVStream ミニドライバーの設計ガイドに関するページ
カメラ用 Windows ストア デバイス アプリのサンプルに関するページ
Driver MFT のサンプルに関するページ

 

 

表示:
© 2014 Microsoft