Erstellen eines Kameratreibers MFT für eine UWP-Geräte-App
Wichtig
Dieses Thema ist veraltet. Aktualisierte Anleitungen finden Sie im Geräte-MFT-Entwurfshandbuch.
Mit UWP-Geräte-Apps können Gerätehersteller benutzerdefinierte Einstellungen und Spezialeffekte auf den Videostream der Kamera mit einem Kameratreiber MFT (Media Foundation Transform) anwenden. In diesem Thema werden Treiber-MFTs vorgestellt und das Beispiel Driver MFT verwendet, um zu zeigen, wie eine erstellt wird. Weitere Informationen zu UWP-Geräte-Apps im Allgemeinen finden Sie unter UWP-Geräte-Apps kennenlernen.
Der Treiber MFT
In diesem Abschnitt wird die Media Foundation Transform (MFT) beschrieben, die Sie erstellen, um Effekte auf den Medienaufnahmedatenstream anzuwenden, der von der Kamera stammt. So stellen Sie Transformationen für Farbeffekte, Schemamodi und Gesichtsverfolgungseffekte bereit, die Ihre Kamera wirklich von anderen unterscheiden. Diese MFT, auch Treiber-MFT genannt, wird zunächst auf den verbundenen Videostream angewendet, der vom Kameratreiber kommt, wenn eine UWP-App mit der Videoaufnahme beginnt. Wenn diese App die Kamera Options-UI aufruft, bietet Windows automatisch Zugriff auf alle Schnittstellen, die der Treiber MFT zur Steuerung seiner benutzerdefinierten Effekte implementiert.
Ein Treiber-MFT ist für eine UWP-Geräte-App nicht erforderlich. Ein Gerätehersteller kann sich dafür entscheiden, eine UWP-Geräte-App ohne Treiber-MFT zu implementieren, um lediglich eine differenzierte Benutzeroberfläche mit Branding für seine Hardware bereitzustellen, ohne benutzerdefinierte Einstellungen und Spezialeffekte auf den Videostream anzuwenden.
Wie wird ein Treiber-MFT verwendet?
Die UWP-Geräte-App für eine Kamera wird in einem anderen Prozess als die Microsoft Store-App ausgeführt, die sie aus der Kamera CaptureUI-API aufruft. Damit die Microsoft Store-Geräte-App eine Treiber-MFT steuern kann, muss eine bestimmte Abfolge von Ereignissen über verschiedene Prozessräume hinweg erfolgen.
Eine UWP-App möchte ein Foto aufnehmen, sodass sie die CaptureFileAsync-Methode aufruft.
Windows fordert den MFT-Zeiger des Treibers und die Geräte-ID der Kamera an.
Der MFT-Treiberzeiger wird an einen Einstellungshost übergeben.
Der Host fragt Geräteeigenschaften für die App-ID der Microsoft Store-Geräte-App ab, die der Kamera zugeordnet ist (pro Gerätemetadaten).
Wenn keine UWP-Geräte-App gefunden wird, interagiert das Standard-Flyout mit dem Aufnahmemodul.
Wenn eine UWP-Geräte-App gefunden wird, wird sie aktiviert, und der Einstellungshost übergibt den MFT-Treiberzeiger an die App.
Die UWP-Geräte-App steuert den Treiber MFT mithilfe der Schnittstelle, die über den Zeiger verfügbar gemacht wird.
AvStream-Treibermodellanforderung
Der Kameratreiber muss das AvStream-Treibermodell verwenden. Weitere Informationen zum AVStream-Treibermodell finden Sie im Designleitfaden für AVStream Minidrivers.
Wie der Treiber MFT für Apps verfügbar gemacht wird
Ein Treiber-MFT wird bei Windows als COM-Schnittstelle registriert, sodass die von ihm implementierte Transformation auf den Medienstream angewendet werden kann, der von einem bestimmten Gerät, beispielsweise einer Kamera, kommt.
Hinweis
Ein Treiber-MFT sollte nicht mithilfe der MFTRegister
Funktion registriert werden, da er gerätespezifisch und kein allgemeiner MFT ist. Informationen zum Registrierungsschlüssel finden Sie im Abschnitt Installieren und Registrieren des Treibers MFT weiter unten in diesem Thema.
Wenn eine App eine Videoaufnahme initiiert, wird ein Media Foundation Source Reader instanziiert, um den Videostream bereitzustellen. Diese Medienquelle liest einen Registrierungswert aus dem Geräteregistrierungsschlüssel. Wenn die CLSID der COM-Klasse des Treibers MFT im Registrierungswert gefunden wird, instanziiert der Quellleser den Treiber MFT und fügt sie in die Medienpipeline ein.
Zusätzlich zu UWP-Geräte-Apps kann auf die MFT-Funktionalität des Treibers zugegriffen werden, wenn das damit verbundene Gerät zum Aufnehmen von Videos mithilfe der folgenden APIs verwendet wird:
HTML5-<Videotags> in einer UWP-App mit HTML. Transformationen, die der Treiber MFT aktiviert hat, wirken sich auf Videos aus, die mit dem <Videoelement> wiedergegeben werden, wie im folgenden Codebeispiel gezeigt:
var video = document.getElementById('myvideo'); video.src = URL.createObjectURL(fileItem); video.play();
Windows.Media.MediaCapture-API in einer UWP-App mit Verwendung von Windows-Runtime. Weitere Informationen zur Verwendung dieser API finden Sie im Beispiel für die Medienaufnahme .
Media Foundation Source Reader, für Apps, die Mediendaten verarbeiten. Der Treiber-MFT wird beim Aufruf von
IMFSourceReaderEx::GetTransformForStream
als erster (0.) MFT für Anwendungen verfügbar gemacht. Die Kategorie, die zurückgegeben wird, istMFT_CATEGORY_VIDEO_EFFECT
.
Multi-Pin-Kameras
Wenn Sie eine Drei-Pin- oder eine andere Multi-Pin-Kamera haben, lesen Sie Überlegungen zu Treiber-MFTs bei Multi-Pin-Kameras.
MFT-Treiber-Implementierung
Dieser Abschnitt enthält Informationen zur Implementierung des MFT-Treibers. Ein vollständiges Beispiel für einen Treiber-MFT, der zusammen mit einer UWP-Geräte-App funktioniert, finden Sie im Beispiel Treiber MFT.
Entwicklungstools
Microsoft Visual Studio Professional oder Microsoft Visual Studio Ultimate ist erforderlich.
Treiber-MFT-Eigenschaften
Der Treiber-MFT wird pro Datenstrom instanziiert. Für jeden Datenstrom, den die Kamera unterstützt, wird eine Instanz des MFT instanziiert und damit verbunden. Der Treiber-MFT wird erwartet, dass ein einzelner Eingabedatenstrom und ein einzelner Ausgabedatenstrom vorhanden sind. Der Treiber-MFT kann entweder ein synchroner MFT oder ein asynchroner MFT sein.
Kommunikation zwischen Kamera und Treiber-MFT
Um die bidirektionale Kommunikation zwischen der Medienquelle und dem Treiber-MFT zu ermöglichen, wird der Zeiger auf den Attributspeicher des Quelldatenstroms im Eingabedatenstrom-Attributspeicher des Treiber-MFT als MFT_CONNECTED_STREAM_ATTRIBUTE
festgelegt. Dies geschieht durch einen Handshake-Prozess, den Sie aktivieren, indem Sie den Treiber-MFT verfügbarmachen MFT_ENUM_HARDWARE_URL_Attribute
, wie im folgenden Beispiel:
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;
}
In diesem Beispiel ist die MFT_CONNECTED_STREAM_ATTRIBUTE
im Attributspeicher des Treiber-MFT so eingestellt, dass sie auf den Attributspeicher des Gerätequellstreams verweist. Weitere Informationen zur Einrichtung der Kommunikation zwischen der Kamera und dem MFT finden Sie unter Hardware Handshake Sequence .
Zugreifen auf Gerätequelleninformationen
Das folgende Codebeispiel zeigt, wie der Treiber-MFT den Zeiger auf die Quelltransformation aus dem Eingabeattributespeicher abrufen kann. Der Treiber-MFT kann dann den Quellzeiger verwenden, um Gerätequelleninformationen abzurufen.
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.
}
Implementieren des Passthroughmodus
Um den Treiber-MFT im Passthroughmodus zu platzieren, geben Sie denselben Medientyp für den Eingabe- und Ausgabedatenstrom an. ProcessInput
und ProcessOutput
ruft MFT wird weiterhin aufgerufen. Sie bleibt bis zur Treiber-MFT Implementierung, um zu bestimmen, ob eine Verarbeitung im Passthroughmodus erfolgt oder nicht.
Einzubindende Header-Dateien
Sie müssen Headerdateien für die IInspectable
und IMFTransform
Methoden einschließen, die vom Treiber-MFT implementiert werden müssen. Eine Liste der einzuschließenden Headerdateien finden Sie unter stdafx.h im SampleMFT0-Verzeichnis der UWP-Geräte-App für das Kamerabeispiel .
// required for IInspectable
#include <inspectable.h>
Implementieren von IInspectable
Ein Treiber-MFT, der für die Verwendung über die UWP-Geräte-App einer Kamera vorgesehen ist, muss die Methoden IInspectable
implementieren, damit die Microsoft Store-Geräte-App beim Start auf einen Zeiger auf den Treiber MFT zugreifen kann. Ihr TreiberMFT sollte die folgenden Methoden IInspectable
implementieren:
IInspectable::GetIids sollte Null im iids-Out-Parameter zurückgeben und "0" im iidCount-Out-Parameter zurückgeben.
IInspectable::GetRuntimeClassName sollte Null im Out-Parameter zurückgeben.
IInspectable::GetRuntiGetTrustLevel sollte im Out-Parameter zurückgegeben werden
TrustLevel::BaseTrust
.
Das folgende Codebeispiel zeigt, wie die IInspectable
Methoden im Beispieltreiber MFT implementiert werden. Dieser Code befindet sich in der Mft0.cpp-Datei im SampleMFT0-Verzeichnis des Beispiels.
// 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-Implementierung
Jede Schnittstelle, die Ihr Treiber-MFT implementiert, sollte implementiert und abgeleitet IUnknown
werden, um ordnungsgemäß an die UWP-Geräte-App der Kamera gemarstet zu werden. Im Folgenden finden Sie eine Beispieldatei .idl für eine Treiber-MFT, die dies demonstriert.
// 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;
};
};
Hinweis
Der Treiber-MFT ist eine normale COM-Klasse, die mit CoCreateInstance
erstellt werden kann. Sie sollten die MFTRegister
Funktion nicht verwenden, um sie zu registrieren, da es sich nicht um einen allgemeinen MFT handelt.
Erstellen eines Proxys
Der Treiber-MFT ist ein Out-of-Process-Server. Um es in einer UWP-Geräte-App zu verwenden, müssen Sie Marshalling-Unterstützung in einem Proxy bereitstellen, damit Ihre Treiber-MFT-Schnittstelle über Prozessgrenzen hinweg verwendet werden kann. Ein Beispiel hierfür finden Sie im Beispiel Treiber-MFT. Im Beispiel wird der MIDL-Compiler verwendet, um einen stublosen Proxy zu generieren.
Bereitstellen des Treiber-MFT für Apps
Um eine UWP-Geräte-App in C# oder JavaScript zu schreiben, die mit einem Treiber MFT interagiert, müssen Sie eine zusätzliche Komponente im Microsoft Visual Studio-Projekt der Microsoft Store-Geräte-App erstellen. Diese Komponente ist ein Wrapper, der die MFT-Treiberschnittstellen in einer Windows-Runtime Komponente verfügbar macht, die für die Microsoft Store-Geräte-App sichtbar ist.
Das Wrapper-Unterprojekt im Beispiel UWP-Geräte-App für Kamera bietet ein Beispiel dafür, wie Sie Ihren Treiber-MFT der Windows-Runtime zur Verfügung stellen, damit Sie ihn von einer in C# oder JavaScript implementierten UWP-Geräte-App aus verwenden können. Es wurde entwickelt, um mit dem Treiber-MFT-Beispiel zusammenzuarbeiten. Eine schrittweise Anleitung zum Installieren, Ausführen und Testen der Beispiele finden Sie auf der Treiber-MFT-Beispielseite .
Installieren und Registrieren der Treiber-MFT
In diesem Abschnitt werden die Schritte zum Installieren der Treiber-MFT aufgeführt:
Die Treiber-MFT-DLL muss in einem Unterverzeichnis am folgenden Speicherort installiert werden:
- %SystemDrive%\Programme\
Ihr Kamerainstallationsprogramm registriert den Treiber MFT durch Aufrufen von regsvr32 auf der Treiber-MFT-DLL oder durch Bereitstellen einer Treibermanifestdatei (.man) für die DLL, die das Installationsprogramm für die Registrierung verwendet.
Legen Sie den
CameraPostProcessingPluginCLSID
Wert im Registrierungsschlüssel für Ihre Kamera fest. Ihre INF-Datei sollte die CLSID des Treiber-MFT im Registrierungsschlüssel der Geräteklasse für das Gerät angeben, indem Sie denCameraPostProcessingPluginCLSID
Wert auf die CLSID-GUID der Treiber-MFT-Klasse festlegen. Es folgt ein Beispiel aus einem INF-Dateieintrag, der die Registrierungsschlüssel für eine Kamera auffüllt:
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}"
Hinweis
KSCATEGORY_VIDEO_CAMERA
wird für Kameras empfohlen. Normalerweise benötigen Sie nur einen der Registrierungsschlüssel, je nachdem, wie das Gerät registriert ist.
Zuordnen Ihrer App zur Kamera
Dieser Abschnitt enthält Informationen zu den Schritten, die erforderlich sind, um Ihre Kamera in Gerätemetadaten und in der Windows-Registrierung zu identifizieren. Mit diesen Metadaten können Sie Ihre UWP-Geräte-App koppeln und Ihre App identifizieren, damit sie nahtlos heruntergeladen werden kann, wenn die Kamera zum ersten Mal verbunden ist.
Updates
Wenn der Benutzer nach der ersten Installation der App eine aktualisierte Version der App herunterlädt, werden die Updates automatisch in das Kameraaufnahmeerlebnis integriert. Updates werden jedoch nicht automatisch heruntergeladen. Der Benutzer muss zusätzliche App-Updates aus dem Microsoft Store herunterladen, da die App nur bei der ersten Verbindung automatisch installiert wird. Die Standard Seite Ihrer UWP-Geräte-App kann Benachrichtigungen bereitstellen, dass Updates verfügbar sind, und Links zum Herunterladen von Updates bereitstellen.
Wichtig
Ihre aktualisierte App sollte mit allen aktualisierten Treibern arbeiten, die über Windows Update verteilt werden.
Mehrere Kameras
Mehrere Kameramodelle können dieselbe UWP-Geräte-App in ihren Gerätemetadaten deklarieren. Wenn ein System über mehrere intern eingebettete Kameras verfügt, müssen die Kameras dieselbe UWP-Geräte-App verwenden. Die App enthält Logik zum Bestimmen der verwendeten Kamera und kann für jede Kamera unterschiedliche Ui-Elemente in der Benutzeroberfläche Weitere Optionen anzeigen. Weitere Informationen zum Anpassen dieser Oberfläche finden Sie unter Anpassen von Kameraoptionen.
Interne Kameras
UWP-Geräte-Apps für interne Kameras sind für die automatische Installation aus dem Microsoft Store berechtigt, es wird jedoch empfohlen, dass sie für die nahtlose Benutzererfahrung vorinstalliert sind. Es sind zusätzliche Schritte erforderlich, um interne Kameras zu unterstützen und eine UWP-Geräte-App zuzuordnen. Weitere Informationen finden Sie unter Identifizieren der Position interner Kameras.
Erstellen des Gerätemetadatenpakets
Für interne und externe Kameras müssen Sie ein Gerätemetadatenpaket erstellen. Wenn Sie die UWP-Geräte-App Ihrer Kamera an den Microsoft Store übermitteln (oder mit dem OPK vorinstallieren, im Falle interner Kameras), müssen Sie zusätzlich zur App selbst Metadaten bereitstellen, die Folgendes enthalten:
Name des Anwendungsherausgebers
Anwendungspaketname
Anwendungselementbezeichner
Gerätedarstellungs-ID
Weitere Informationen zur Verwendung von Gerätemetadaten zum Zuordnen Ihrer App zu Ihrem Gerät finden Sie unter Erstellen von UWP-Geräte-Apps.
Zugehörige Themen
Automatische Installation für UWP-Geräte-Apps
Hardware Handshake Sequence (Hardware MFTs)
Designhandbuch für AVStream Minidrivers