Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Viktigt!
Det här avsnittet är inaktuellt. Se designguiden för enhets-MFT för uppdaterad vägledning.
UWP-enhetsappar låter enhetstillverkare tillämpa anpassade inställningar och specialeffekter på kamerans videoström med en kameradrivrutin MFT (media foundation transform). Det här avsnittet beskriver drivrutins-MT:er och använder MFT-exemplet för drivrutinen för att visa hur du skapar en. Mer information om UWP-enhetsappar i allmänhet finns i Meet UWP device apps.
Drivrutinen MFT
Det här avsnittet beskriver MFT (Media Foundation Transform) som du skapar för att tillämpa effekter på medieinspelningsströmmen som kommer från kameran. Det är så här du tillhandahåller transformeringar för färgeffekter, schemalägen och ansiktsspårningseffekter som verkligen skiljer kameran från andra. Denna MFT, känd som drivrutin-MFT, tillämpas först på den anslutna videoströmmen som kommer från kameradrivrutinen när en UWP-app påbörjar videoinspelning. När appen anropar användargränssnittet för kameraalternativ ger Windows automatiskt åtkomst till alla gränssnitt som drivrutinen MFT implementerar för att kontrollera dess anpassade effekter.
En Driver MFT krävs inte för en UWP-enhetsapp. En enhetstillverkare kan välja att implementera en UWP-enhetsapp utan drivrutins-MFT, helt enkelt för att tillhandahålla ett differentierat användargränssnitt som innehåller varumärkesanpassning för maskinvaran, utan att tillämpa anpassade inställningar och specialeffekter på videoströmmen.
Så här används en drivrutin för MFT
UWP-enhetsappen för en kamera körs i en annan process än den Microsoft Store-app som anropar den via CameraCaptureUI-API. För att Microsoft Store-enhetsappen ska kunna styra en drivrutins MFT måste en specifik sekvens med händelser i olika processutrymmen ske.
En UWP-app vill ta ett foto, så den anropar metoden CaptureFileAsync
Windows begär drivrutinens MFT-pekare och kamerans enhets-ID
Pekaren för drivrutins-MFT skickas till en inställningsvärd
Värddatorn hämtar enhetsegenskaper för app-ID:t till enhetsappen för Microsoft Store som är associerad med kameran (enligt enhetsmetadata)
Om ingen UWP-enhetsapp hittas interagerar standardmenyn med inspelningsmotorn.
Om en UWP-enhetsapp hittas aktiveras den och via inställningsenheten skickas MFT-pekaren för drivrutinen till den.
UWP-enhetsappen styr drivrutins-MFT med hjälp av gränssnittet som exponeras via pekaren
Krav för AvStream-drivrutinsmodell
Kamerans drivrutin måste använda AvStream-drivrutinsmodellen. Mer information om AVStream-drivrutinsmodellen finns i Designguide för AVStream Minidrivers.
Hur drivrutinen MFT exponeras för appar
En drivrutins-MFT registreras med Windows som ett COM-gränssnitt så att den transformering som implementeras kan tillämpas på medieströmmen som kommer från en specifik enhet, till exempel en kamera.
Anmärkning
En MFT-drivrutin bör inte registreras med hjälp av MFTRegister funktionen eftersom den är enhetsspecifik och inte en allmän MFT. Information om registernyckeln finns i avsnittet Installera och registrera drivrutins-MFT senare i det här avsnittet.
När en app initierar en videoinspelning instansieras en Media Foundation-källläsare för att tillhandahålla videoströmmen. Den här mediekällan läser ett registervärde från enhetsregisternyckeln. Om CLSID för COM-klass för drivrutinens MFT hittas i registervärdet, instansierar källläsaren drivrutinens MFT och infogar den i mediepipelinen.
Förutom UWP-enhetsappar kan MFT-drivrutinsfunktionen nås när enheten som är associerad med den används för att samla in video med hjälp av följande API:er:
HTML5-videotaggar <> i en UWP-app med HTML. Transformeringar som drivrutinen MFT har aktiverat påverkar video som spelas upp med hjälp av <videoelementet> , som i följande kodexempel:
var video = document.getElementById('myvideo'); video.src = URL.createObjectURL(fileItem); video.play();Windows.Media.MediaCapture API i en UWP-app med hjälp av Windows Runtime. Mer information om hur det här API:et används finns i Media Capture-exemplet .
Media Foundations källläsare för appar som bearbetar mediedata. Drivrutins-MFT visas för applikationer som den första (0:e) MFT när du anropar
IMFSourceReaderEx::GetTransformForStream. Kategorin som ska returneras ärMFT_CATEGORY_VIDEO_EFFECT.
Kameror med flera stift
Om du har en kamera med tre stift eller en annan kamera med flera stift kan du läsa Överväganden för drivrutins-MFI på kameror med flera stift.
Drivrutins-MFT-implementering
Det här avsnittet innehåller information om hur du implementerar drivrutins-MFT. Ett fullständigt exempel på en drivrutins-MFT som fungerar tillsammans med en UWP-enhetsapp finns i exemplet driver MFT .
Utvecklingsverktyg
Microsoft Visual Studio Professional eller Microsoft Visual Studio Ultimate krävs.
MFT-egenskaper för drivrutin
Drivrutins-MFT instansieras för varje ström. För varje ström som kameran stöder skapas en instans av MFT och ansluts till den. Drivrutins-MFT förväntas ha en enda indataström och en enda utdataström. Drivrutins-MFT kan vara antingen en synkron MFT eller en asynkron MFT.
Kommunikation mellan kameran och drivrutinen MFT
Om du vill aktivera dubbelriktad kommunikation mellan mediekällan och drivrutinens MFT, ställs pekaren till källströmmens attributlagring in på indataströmsattributlagret för drivrutinens MFT som MFT_CONNECTED_STREAM_ATTRIBUTE. Detta sker genom en handskakningsprocess som du aktiverar genom att exponera MFT_ENUM_HARDWARE_URL_Attribute i drivrutinens MFT, enligt följande exempel:
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;
}
I det här exemplet är MFT_CONNECTED_STREAM_ATTRIBUTE i drivrutinens MFT-attributarkiv inställd på att peka på enhetskällans attributarkiv. Mer information om hur kommunikationen mellan kameran och MFT har konfigurerats finns i Handskakningssekvens för maskinvara .
Så här kommer du åt information om enhetens källa
I följande kodexempel visas hur drivrutinen MFT kan hämta pekaren till källtransformatorn från indataattributarkivet. Drivrutinen MFT kan sedan använda källpekaren för att hämta enhetens källinformation.
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.
}
Så här implementerar du genomströmningsläge
Om du vill placera drivrutinens MFT i genomströmningsläge anger du samma medietyp för indata- och utdataströmmen.
ProcessInput och ProcessOutput samtal på MFT kommer fortfarande att göras. Det är upp till din drivrutins MFT-implementering att avgöra om någon bearbetning sker i genomströmningsläge eller inte.
Rubrikfiler som ska inkluderas
Du måste inkludera huvudfiler för de IInspectable metoder och IMFTransform metoder som MFT-drivrutinen måste implementera. En lista över huvudfiler som ska inkluderas finns i stdafx.h i katalogen SampleMFT0 i UWP-enhetsappen för kameraexempel .
// required for IInspectable
#include <inspectable.h>
Så här implementerar du IInspectable
En drivrutins-MFT som är avsedd att användas från en kameras UWP-enhetsapp måste implementera metoderna IInspectable så att Microsoft Store-enhetsappen kan komma åt en pekare till drivrutins-MFT när den startas. Din MFT-drivrutin bör implementera metoderna i IInspectable på följande sätt:
IInspectable::GetIids ska returnera null i parametern iids out och returnera 0 i parametern iidCount out.
IInspectable::GetRuntimeClassName ska returnera null i out-parametern.
IInspectable::GetRuntiGetTrustLevel bör returnera
TrustLevel::BaseTrusti ut-parametern.
Följande kodexempel visar hur IInspectable metoderna implementeras i exempeldrivrutinenS MFT. Den här koden finns i Mft0.cpp-filen i sampleMFT0-katalogen i exemplet.
// 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-implementering
Varje gränssnitt som din drivrutin MFT implementerar bör implementera och härleda från IUnknown, för att kunna konverteras korrekt till kamerans UWP-enhetsapp. Följande är ett exempel på en .idl-fil för en drivrutins-MFT som visar detta.
// 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;
};
};
Anmärkning
Drivrutins-MFT är en vanlig COM-klass som kan skapas med CoCreateInstance. Du bör inte använda MFTRegister funktionen för att registrera den eftersom den inte är en generell MFT.
Skapa en proxy
Drivrutinen MFT är en server utanför processen. Om du vill använda den i en UWP-enhetsapp måste du tillhandahålla stöd för marskalkering i en proxy så att drivrutinsgränssnittet för MFT kan användas över processgränser. Du kan hitta ett exempel på detta i Driver MFT-exemplet. Exemplet använder MIDL-kompilatorn för att generera en stubless-proxy.
Exponera drivrutinens MFT för appar
Om du vill skriva en UWP-enhetsapp i C# eller JavaScript som interagerar med en MFT-drivrutin måste du skapa ytterligare en komponent i Microsoft Store-enhetsappens Microsoft Visual Studio-projekt. Den här komponenten är en omslutning som exponerar drivrutinens MFT-gränssnitt i en Windows Runtime-komponent som är synlig för enhetsappen i Microsoft Store.
Wrapper-delprojektet i UWP-enhetsappen för kameran exempel ger ett exempel på hur du exponerar din drivrutins MFT för Windows Runtime, så att du kan använda den från en UWP-enhetsapp som implementerats i C# eller JavaScript. Det är utformat för att fungera tillsammans med exemplet Driver MFT. På exempelsidan För drivrutins-MFT finns en stegvis guide för att installera, köra och testa exemplen.
Installera och registrera drivrutinen MFT
I det här avsnittet visas steg för att installera drivrutins-MFT:
MFT DLL för drivrutiner måste installeras i en underkatalog på följande plats:
- %SystemDrive%\Program Files\
Kamerainstallationsprogrammet registrerar drivrutins-MFT genom att anropa regsvr32 på drivrutins-MFT DLL eller genom att ange en drivrutinsmanifestfil (.man) för den DLL som installationsprogrammet använder för registrering.
CameraPostProcessingPluginCLSIDAnge värdet i registernyckeln för kameran. INF-filen ska ange CLSID för Driver MFT i enhetsklassens registernyckel för enheten genom att ställa in värdetCameraPostProcessingPluginCLSIDtill GUID:en för CLSID för Driver MFT-klassen. Följande är ett exempel från en INF-filpost som fyller i registernycklarna för en kamera:
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}"
Anmärkning
KSCATEGORY_VIDEO_CAMERA rekommenderas för kameror. Normalt behöver du bara en av registernycklarna, beroende på hur enheten registreras.
Associera din app med kameran
Det här avsnittet innehåller information om de steg som krävs för att identifiera kameran i enhetsmetadata och i Windows-registret. Med dessa metadata kan du parkoppla UWP-enhetsappen och identifiera din app så att den kan laddas ned sömlöst första gången kameran är ansluten.
Uppdateringar
Efter den första installationen av appen, om användaren laddar ned en uppdaterad version av appen, integreras uppdateringarna automatiskt i kamerainspelningsupplevelsen. Uppdateringar laddas dock inte ned automatiskt. Användaren måste ladda ned ytterligare appuppdateringar från Microsoft Store eftersom appen endast installeras automatiskt vid den första anslutningen. Huvudsidan i UWP-enhetsappen kan ge meddelanden om att uppdateringar är tillgängliga och tillhandahålla länkar för att ladda ned uppdateringar.
Viktigt!
Din uppdaterade app bör fungera med alla uppdaterade drivrutiner som distribueras via Windows Update.
Flera kameror
Flera kameramodeller kan deklarera samma UWP-enhetsapp i sina enhetsmetadata. Om ett system har fler än en internt inbäddad kamera måste kamerorna dela samma UWP-enhetsapp. Appen innehåller logik för att avgöra vilken kamera som används och kan visa olika användargränssnitt för varje kamera i upplevelsen 'Fler alternativ'. Mer information om hur du anpassar den upplevelsen finns i Anpassa kameraalternativ.
Interna kameror
UWP-enhetsappar för interna kameror är berättigade till automatisk installation från Microsoft Store, men vi rekommenderar att de förinstalleras för den mest sömlösa användarupplevelsen. Det finns ytterligare steg som krävs för att stödja interna kameror och associera en UWP-enhetsapp med dem. Mer information finns i Identifiera platsen för interna kameror.
Skapa enhetens metadatapaket
För både interna och externa kameror måste du skapa ett enhetsmetadatapaket. När du skickar kamerans UWP-enhetsapp till Microsoft Store (eller förinstallerar den med OPK, om det gäller interna kameror), måste du, förutom själva appen, ange metadata som innehåller följande:
Namn på programutgivare
Namn på programpaket
Programelementidentifierare
Identifierare för enhetsupplevelse
Mer information om hur du använder enhetsmetadata för att associera din app med din enhet finns i Skapa UWP-enhetsappar.
Relaterade ämnen
Automatisk installation för UWP-enhetsappar
Maskinvaruhandskakningssekvens (maskinvaru-MFT)
Designguide för AVStream Minidrivers