Important
この記事は非推奨です。 更新されたガイダンスについては、 デバイス MFT 設計ガイド を参照してください。
Important
デバイス メタデータは非推奨となり、Windows の今後のリリースで削除される予定です。 この機能の置き換えについては、「 ドライバー パッケージ コンテナー メタデータ」を参照してください。
UWP デバイス アプリを使用すると、デバイスの製造元は、カメラ ドライバー MFT (メディアファンデーション変換) を使用して、カメラのビデオ ストリームにカスタム設定と特殊効果を適用できます。 This article introduces driver MFTs and uses the Driver MFT sample to show how to create one. UWP デバイス アプリ全般の詳細については、「UWP デバイス アプリを使用する」を参照してください。
ドライバー MFT
このセクションでは、カメラからのメディア キャプチャ ストリームに効果を適用するために作成する Media Foundation Transform (MFT) について説明します。 この変換は、カメラを他のカメラと本当に区別する色効果、スキーム モード、顔追跡効果を提供する方法です。 ドライバー MFT と呼ばれるこの MFT は、UWP アプリがビデオ キャプチャを開始したときに、カメラ ドライバーから送信される接続されたビデオ ストリームに最初に適用されます。 When that app invokes the Camera options UI, Windows automatically provides access to any interfaces the driver MFT implements for controlling its custom effects.
UWP デバイス アプリでは、ドライバー MFT は必要ありません。 デバイスの製造元は、カスタム設定や特殊効果をビデオ ストリームに適用せずに、ハードウェアのブランド化を含む差別化されたユーザー インターフェイスを提供するために、ドライバー MFT を使用せずに UWP デバイス アプリを実装することを選択できます。
ドライバー MFT の使用方法
The UWP device app for a camera runs in a different process than the Microsoft Store app that invokes it from the CameraCaptureUI API. Microsoft Store デバイス アプリでドライバー MFT を制御するには、異なるプロセス空間にわたる特定のイベント シーケンスが発生する必要があります。
A UWP app wants to capture a photo, so it calls the CaptureFileAsync method
Windows は、ドライバーの MFT ポインターとカメラのデバイス ID を要求します。
ドライバー MFT ポインターが設定ホストに渡される
ホストは、カメラに関連付けられている Microsoft Store デバイス アプリのアプリ ID のデバイス プロパティを照会します (デバイス メタデータごと)
UWP デバイス アプリが見つからない場合、既定のポップアップはキャプチャ エンジンと対話します
UWP デバイス アプリが見つかった場合はアクティブ化され、設定ホストはドライバー MFT ポインターをそれに渡します
UWP デバイス アプリは、ポインターを介して公開されるインターフェイスを使用してドライバー MFT を制御します
AvStream ドライバー モデルの要件
カメラのドライバーは AvStream ドライバー モデルを使用する必要があります。 AVStream ドライバー モデルの詳細については、「 AVStream ミニドライバー設計ガイド」を参照してください。
ドライバー MFT をアプリに公開する方法
ドライバー MFT は、実装する変換をカメラなどの特定のデバイスから出てくるメディア ストリームに適用できるように、COM インターフェイスとして Windows に登録されます。
Note
ドライバー MFT はデバイス固有であり、汎用 MFT ではないため、 MFTRegister 関数を使用して登録しないでください。 レジストリ キーの詳細については、この記事で後述 する「ドライバー MFT のインストールと登録 」セクションを参照してください。
アプリがビデオ キャプチャを開始すると、Media Foundation ソース リーダーがインスタンス化され、ビデオ ストリームが提供されます。 このメディア ソースは、デバイス レジストリ キーからレジストリ値を読み取ります。 ドライバー MFT の COM クラスの CLSID がレジストリ値に見つかった場合、ソース リーダーはドライバー MFT をインスタンス化し、メディア パイプラインに挿入します。
UWP デバイス アプリに加えて、次の API を使用してビデオをキャプチャするために関連付けられているデバイスを使用すると、ドライバー MFT 機能にアクセスできます。
HTML を使用した UWP アプリの HTML5 <video> タグ。 次のコード例のように、ドライバー MFT が有効にする変換が、 <video> 要素を使用して再生されているビデオに影響を与えます。
var video = document.getElementById('myvideo'); video.src = URL.createObjectURL(fileItem); video.play();Windows ランタイムを使用する UWP アプリの Windows.Media.MediaCapture API。 For more info on how this API is used, see the Media Capture sample.
メディア データを処理するアプリ用の Media Foundation のソース リーダー。 ドライバー MFT は、
IMFSourceReaderEx::GetTransformForStreamを呼び出すときに、最初の (0 番目の) MFT としてアプリケーションに公開されます。 返されるカテゴリはMFT_CATEGORY_VIDEO_EFFECT。
Multi-pin cameras
3 ピンまたは他のマルチピン カメラがある場合は、 マルチピン カメラのドライバーの MFT に関する考慮事項を参照してください。
ドライバー MFT の実装
このセクションでは、ドライバー MFT の実装について説明します。 For a full example of a driver MFT that works together with a UWP device app, see the Driver MFT sample.
Development tools
Microsoft Visual Studio Professional または Microsoft Visual Studio Ultimate が必要です。
ドライバーの MFT 特性
ドライバー MFT はストリームごとにインスタンス化されます。 カメラがサポートするストリームごとに、MFT のインスタンスがインスタンス化され、それに接続されます。 ドライバー MFT には、1 つの入力ストリームと 1 つの出力ストリームが必要です。 ドライバー MFT には、同期 MFT または非同期 MFT があります。
カメラとドライバー MFT の間の通信
メディア ソースとドライバー MFT の間で双方向通信を有効にするには、ソース ストリームの属性ストアへのポインターが、 MFT_CONNECTED_STREAM_ATTRIBUTEとしてドライバー MFT の入力ストリーム属性ストアに設定されます。 これは、次の例のように、ドライバー 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;
}
この例では、ドライバー MFT の属性ストアの MFT_CONNECTED_STREAM_ATTRIBUTE が、デバイス ソース ストリームの属性ストアを指すように設定されています。 カメラと MFT の間の通信の設定方法の詳細については、「 ハードウェア ハンドシェイク シーケンス 」を参照してください。
デバイス ソース情報にアクセスする方法
次のコード例は、ドライバー MFT が入力属性ストアからソース変換へのポインターを取得する方法を示しています。 その後、ドライバー 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.
}
パススルー モードを実装する方法
ドライバー MFT をパススルー モードにするには、入力ストリームと出力ストリームに同じメディアの種類を指定します。
ProcessInput MFT に対する ProcessOutput 呼び出しは引き続き行われます。 パススルー モードで処理が行われるかどうかを判断するには、ドライバーの MFT 実装が必要です。
含めるヘッダー ファイル
ドライバー MFT が実装する必要がある IInspectable メソッドと IMFTransform メソッドのヘッダー ファイルを含める必要があります。 For a list of header files to include, see stdafx.h in the SampleMFT0 directory of the UWP device app for camera sample.
// required for IInspectable
#include <inspectable.h>
IInspectable を実装する方法
カメラの UWP デバイス アプリから使用することを目的としたドライバー MFT は、起動時に Microsoft Store デバイス アプリがドライバー MFT へのポインターにアクセスできるように、 IInspectable のメソッドを実装する必要があります。 ドライバー MFT は、次のように IInspectable のメソッドを実装する必要があります。
IInspectable::GetIids should return null in the iids out parameter, and return 0 in the iidCount out parameter.
IInspectable::GetRuntimeClassName should return null in the out parameter.
IInspectable::GetRuntiGetTrustLevel should return
TrustLevel::BaseTrustin the out parameter.
次のコード例は、サンプル ドライバー MFT で IInspectable メソッドを実装する方法を示しています。 This code can be found in the Mft0.cpp file, in the SampleMFT0 directory of the sample.
// 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 implementation
ドライバー MFT が実装する各インターフェイスは、カメラの UWP デバイス アプリに正しくマーシャリングするために、 IUnknownを実装して派生させる必要があります。 The following is an example .idl file for a driver MFT that demonstrates this.
// 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;
};
};
Note
ドライバー MFT は、 CoCreateInstanceを使用して作成できる通常の COM クラスです。 汎用 MFT ではないので、 MFTRegister 関数を使用して登録しないでください。
プロキシの作成
ドライバー MFT はアウトプロセス サーバーです。 UWP デバイス アプリで使用するには、ドライバーの MFT インターフェイスをプロセス境界を越えて使用できるように、プロキシでマーシャリング サポートを提供する必要があります。 You can find an example of this in the Driver MFT sample. このサンプルでは、MIDL コンパイラを使用してスタブレス プロキシを生成します。
ドライバー MFT をアプリに公開する
ドライバー MFT と対話する C# または JavaScript で UWP デバイス アプリを作成するには、Microsoft Store デバイス アプリの Microsoft Visual Studio プロジェクトで別のコンポーネントを作成する必要があります。 このコンポーネントは、Microsoft Store デバイス アプリに表示される Windows ランタイム コンポーネントのドライバー MFT インターフェイスを公開するラッパーです。
カメラ用 UWP デバイス アプリのラッパー サブプロジェクトサンプルでは、ドライバー MFT を Windows ランタイムに公開して、C# または JavaScript に実装されている UWP デバイス アプリから使用できるようにする方法の例を示します。 It's designed to work together with the Driver MFT sample. See the Driver MFT sample page for a step-by-step guide to installing, running, and testing the samples.
ドライバー MFT のインストールと登録
このセクションでは、ドライバー MFT をインストールする手順の一覧を示します。
ドライバー MFT DLL は、次の場所のサブディレクトリにインストールする必要があります。
- %SystemDrive%\Program Files\
Your camera installer registers the driver MFT by calling regsvr32 on your driver MFT DLL, or by providing a driver manifest (.man) file for the DLL that the installer uses for registration.
カメラのレジストリ キーに
CameraPostProcessingPluginCLSID値を設定します。 INF ファイルでは、CameraPostProcessingPluginCLSID値をドライバー MFT クラスの CLSID GUID に設定することで、デバイスのデバイス クラス レジストリ キーにドライバー MFT の CLSID を指定する必要があります。 カメラのレジストリ キーを設定する 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}"
Note
KSCATEGORY_VIDEO_CAMERA カメラに推奨されます。 通常は、デバイスの登録方法に応じて、レジストリ キーの 1 つだけが必要です。
アプリをカメラに関連付ける
このセクションでは、デバイス メタデータと Windows レジストリでカメラを識別するために必要な手順について説明します。 このメタデータを使用すると、UWP デバイス アプリをペアリングし、アプリを識別して、カメラが初めて接続されるときにシームレスにダウンロードできるようにします。
Updates
アプリの最初のインストール後、ユーザーがアプリの更新バージョンをダウンロードした場合、更新プログラムは自動的にカメラ キャプチャ エクスペリエンスに統合されます。 ただし、更新プログラムは自動的にダウンロードされません。 The user must download more app updates from the Microsoft Store, because the app is automatically installed only on first connect. UWP デバイス アプリのメイン ページでは、更新プログラムが利用可能であることを通知し、更新プログラムをダウンロードするためのリンクを提供できます。
Important
更新されたアプリは、Windows Update を通じて配布される更新されたドライバーで動作する必要があります。
Multiple cameras
複数のカメラ モデルは、デバイス メタデータで同じ UWP デバイス アプリを宣言できます。 システムに複数の内部埋め込みカメラがある場合、カメラは同じ UWP デバイス アプリを共有する必要があります。 The app includes logic for determining which camera is in use and can show different UI for each camera in its More options experience. そのエクスペリエンスのカスタマイズの詳細については、「 カメラ オプションをカスタマイズする方法」を参照してください。
Internal cameras
UWP device apps for internal cameras are eligible for Automatic installation from the Microsoft Store, but it's recommended that they be preinstalled for the most seamless user experience. 内部カメラをサポートし、UWP デバイス アプリをそれらに関連付けるには、さらに多くの手順が必要です。 詳細については、「 内部カメラの位置の特定」を参照してください。
デバイス メタデータ パッケージの作成
内部カメラと外部カメラの両方で、デバイス メタデータ パッケージを作成する必要があります。 カメラの UWP デバイス アプリを Microsoft Store に提出する (または、内部カメラの場合は OPK を使用してプレインストールする) 場合は、アプリ自体に加えて、次を含むメタデータを提供する必要があります。
- アプリケーションの発行元名
- アプリケーション パッケージ名
- アプリケーション要素識別子
- デバイス エクスペリエンス識別子
デバイス メタデータを使用してアプリをデバイスに関連付ける方法の詳細については、「 UWP デバイス アプリの構築」を参照してください。