Dela via


Skapa en kameradrivrutin MFT för en UWP-enhetsapp

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.

kameradrivrutinen mft hjälper en Windows Store-enhetsapp att ge 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.

  1. En UWP-app vill ta ett foto, så den anropar metoden CaptureFileAsync

  2. Windows begär drivrutinens MFT-pekare och kamerans enhets-ID

  3. Pekaren för drivrutins-MFT skickas till en inställningsvärd

  4. Värddatorn hämtar enhetsegenskaper för app-ID:t till enhetsappen för Microsoft Store som är associerad med kameran (enligt enhetsmetadata)

  5. Om ingen UWP-enhetsapp hittas interagerar standardmenyn med inspelningsmotorn.

  6. Om en UWP-enhetsapp hittas aktiveras den och via inställningsenheten skickas MFT-pekaren för drivrutinen till den.

  7. UWP-enhetsappen styr drivrutins-MFT med hjälp av gränssnittet som exponeras via pekaren

processinteraktionen för att anropa en Windows Store-enhetsapp.

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 är MFT_CATEGORY_VIDEO_EFFECT.

    källläsarens roll i medieinsamling.

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::BaseTrust i 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:

  1. MFT DLL för drivrutiner måste installeras i en underkatalog på följande plats:

    • %SystemDrive%\Program Files\
  2. 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.

  3. CameraPostProcessingPluginCLSID Ange 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ärdet CameraPostProcessingPluginCLSID till 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.

Skapa UWP-enhetsappar

Automatisk installation för UWP-enhetsappar

Maskinvaruhandskakningssekvens (maskinvaru-MFT)

Designguide för AVStream Minidrivers

UWP-enhetsapp för kameraexempel

Exempel på drivrutin för MFT