Поделиться через


Создание драйвера камеры MFT для приложения устройства UWP

Важно!

Этот раздел не рекомендуется. Дополнительные сведения см. в руководстве по проектированию MFT для устройств.

Приложения устройств UWP позволяют производителям устройств применять пользовательские параметры и специальные эффекты для видеопотока камеры с помощью MFT драйвера камеры (преобразование мультимедиа). В этом разделе представлены MFT драйверов и используется пример MFT driver для демонстрации создания. Дополнительные сведения о приложениях устройств UWP см. в статье "Знакомство с приложениями устройств UWP".

Драйвер MFT

В этом разделе описывается преобразование Media Foundation (MFT), которое создается для применения эффектов к потоку захвата мультимедиа, поступающим с камеры. Это то, как вы предоставляете преобразования для цветовых эффектов, режимов схемы и эффектов отслеживания лиц, которые действительно отличают вашу камеру от других. Этот MFT, известный как драйвер MFT, сначала применяется к подключенного видеопотока, исходящего из драйвера камеры, когда приложение UWP начинает запись видео. При вызове пользовательского интерфейса параметров Камера Windows автоматически предоставляет доступ к любым интерфейсам, реализующим MFT драйвера для управления пользовательскими эффектами.

the camera driver mft helps a windows store device app provide custom effects.

MFT драйвера не требуется для приложения устройства UWP. Производитель устройств может реализовать приложение устройства UWP без MFT драйвера, просто чтобы предоставить дифференцированный пользовательский интерфейс, содержащий фирменное символику для своего оборудования, без применения пользовательских параметров и специальных эффектов к видеопотоку.

Использование MFT драйвера

Приложение устройства UWP для камеры выполняется в другом процессе, отличном от приложения Microsoft Store, вызывающего его из API Камера CaptureUI. Для управления драйвером MFT приложение устройства Microsoft Store должно выполнять определенную последовательность событий в разных пространствах процессов.

  1. Приложение UWP хочет записать фотографию, поэтому вызывает метод CaptureFileAsync

  2. Windows запрашивает указатель MFT драйвера и идентификатор устройства камеры

  3. Указатель MFT драйвера передается узлу параметров

  4. Узел запрашивает свойства устройства для идентификатора приложения устройства Microsoft Store, связанного с камерой (на метаданные устройства).

  5. Если приложение устройства UWP не найдено, всплывающее меню по умолчанию взаимодействует с подсистемой отслеживания.

  6. Если найдено приложение устройства UWP, он активируется и узел параметров передает указатель MFT драйвера на него.

  7. Приложение устройства UWP управляет драйвером MFT с помощью интерфейса, доступного через указатель

the process interaction for invoking a windows store device app.

Требование модели драйвера AvStream

Драйвер камеры должен использовать модель драйвера AvStream. Дополнительные сведения о модели драйвера AVStream см. в руководстве по проектированию avStream Minidrivers.

Как драйвер MFT предоставляется приложениям

Драйвер MFT зарегистрирован в Windows в качестве COM-интерфейса, чтобы преобразование, которое оно реализует, можно применить к потоку мультимедиа, выходя из определенного устройства, например камеры.

Примечание.

Драйвер MFT не должен быть зарегистрирован с помощью MFTRegister функции, так как он является конкретным устройством, а не MFT общего назначения. Дополнительные сведения о разделе реестра см . в разделе "Установка и регистрация драйвера MFT " далее в этом разделе.

При запуске видеозахвата приложение создает экземпляр средства чтения источника Media Foundation для предоставления видеопотока. Этот источник мультимедиа считывает значение реестра из раздела реестра устройств. Если CLSID класса COM драйвера MFT найден в значении реестра, средство чтения источника создает экземпляр драйвера MFT и вставляет его в конвейер мультимедиа.

Помимо приложений устройств UWP функции MFT драйвера можно получить, когда устройство, связанное с ним, используется для записи видео с помощью следующих API:

  • Теги видео> HTML5 <в приложении UWP с помощью HTML. Преобразования, включенные драйвером MFT, влияют на воспроизведение видео с помощью <элемента видео> , как показано в следующем примере кода:

    var video = document.getElementById('myvideo');
        video.src = URL.createObjectURL(fileItem);
        video.play();
    
  • API Windows.MediaCapture в приложении UWP с помощью среда выполнения Windows. Дополнительные сведения об использовании этого API см. в примере захвата мультимедиа.

  • Средство чтения источников Media Foundation для приложений, обрабатывающих данные мультимедиа. При вызове IMFSourceReaderEx::GetTransformForStreamдрайвер MFT будет предоставляться приложениям в качестве первого (0-го) MFT. Возвращается MFT_CATEGORY_VIDEO_EFFECTкатегория.

    source reader's role in media capture.

Многокрепные камеры

Если у вас есть трехкрепления или другая многокрепляционная камера, ознакомьтесь с рекомендациями по использованию MFTs драйвера на многокрепляционных камерах.

Реализация MFT драйвера

В этом разделе содержатся сведения о реализации MFT драйвера. Полный пример MFT драйвера, который работает вместе с приложением устройства UWP, см. в примере драйвера MFT .

Средства разработки

Требуется Microsoft Visual Studio Professional или Microsoft Visual Studio Ultimate.

Характеристики MFT драйвера

Драйвер MFT создается для каждого потока. Для каждого потока камера поддерживает экземпляр MFT и подключается к нему. Ожидается, что драйвер MFT имеет один входной поток и один выходной поток. Драйвер MFT может быть синхронным MFT или асинхронным MFT.

Обмен данными между камерой и драйвером MFT

Чтобы включить двустороннее взаимодействие между источником мультимедиа и драйвером MFT, указатель на хранилище атрибутов исходного потока устанавливается в хранилище атрибутов входного потока драйвера MFT.MFT_CONNECTED_STREAM_ATTRIBUTE Это происходит с помощью процесса подтверждения, который можно включить, предоставив MFT_ENUM_HARDWARE_URL_Attribute драйвер MFT, как показано в следующем примере:

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_CONNECTED_STREAM_ATTRIBUTE в хранилище атрибутов MFT драйвера устанавливается указатель на хранилище атрибутов исходного потока устройства. Дополнительные сведения о настройке связи между камерой и 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 и ProcessOutput вызовы по MFT по-прежнему будут сделаны. Он остается в реализации MFT драйвера, чтобы определить, происходит ли обработка в режиме сквозного руководства.

Файлы заголовков для включения

Необходимо включить файлы заголовков для IInspectable методов, IMFTransform которые должен реализовать драйвер MFT. Список файлов заголовков, которые необходимо включить, см. в каталоге SampleMFT0 приложения устройства UWP для примера камеры.

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

Реализация IInspectable

Драйвер MFT, предназначенный для использования из приложения устройства UWP камеры, должен реализовать методы IInspectable , позволяющие приложению устройства Microsoft Store получить доступ к указателю на драйвер MFT при запуске. MFT драйвера должен реализовать следующие методы IInspectable :

  • IInspectable::GetIids должен возвращать значение NULL в параметре iids out и возвращать значение 0 в параметре iidCount out.

  • IInspectable::GetRuntimeClassName должен возвращать значение NULL в параметре out.

  • IInspectable::GetRuntiGetTrustLevel должен возвращаться TrustLevel::BaseTrust в параметре out.

В следующем примере кода показано, как IInspectable методы реализуются в примере драйвера MFT. Этот код можно найти в файле Mft0.cpp в каталоге SampleMFT0 примера.

// 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

Каждый интерфейс, который реализует MFT драйвера, должен реализовывать и производный от IUnknownних, чтобы правильно маршалироваться в приложение устройства UWP камеры. Ниже приведен пример IDL-файла для MFT драйвера, демонстрирующего это.

// 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;
    };
};

Примечание.

Драйвер MFT — это обычный класс COM, который можно создать с помощью CoCreateInstance. Не следует использовать функцию MFTRegister для регистрации, так как она не является MFT общего назначения.

Создание прокси

Драйвер MFT — это внепроцессный сервер. Чтобы использовать его в приложении устройства UWP, необходимо предоставить поддержку маршалинга в прокси-сервере, чтобы интерфейс MFT драйвера можно было использовать через границы процесса. Пример этого можно найти в примере Driver MFT . В примере используется компилятор MIDL для создания заглушного прокси-сервера.

Предоставление драйвера MFT приложениям

Чтобы написать приложение устройства UWP на C# или JavaScript, взаимодействующее с драйвером MFT, необходимо создать дополнительный компонент в проекте microsoft Visual Studio приложения для устройств Microsoft Store. Этот компонент представляет собой оболочку, которая предоставляет интерфейсы MFT драйвера в компоненте среда выполнения Windows, который отображается в приложении устройства Microsoft Store.

Вложенный проект-оболочка в приложении устройства UWP для примера камеры содержит пример предоставления MFT драйвера среда выполнения Windows, чтобы использовать его из приложения устройства UWP, реализованного в C# или JavaScript. Он предназначен для совместной работы с примером Driver MFT . Пример драйвера MFT см. на пошаговом руководстве по установке, выполнению и тестированию примеров.

Установка и регистрация драйвера MFT

В этом разделе перечислены шаги по установке MFT драйвера:

  1. Библиотеку DLL MFT драйвера необходимо установить в подкаталоге в следующем расположении:

    • %SystemDrive%\Program Files\
  2. Установщик камеры регистрирует драйвер MFT, вызвав regsvr32 в библиотеке DLL MFT драйвера или предоставив файл манифеста драйвера (.man) для библиотеки DLL, которую установщик использует для регистрации.

  3. CameraPostProcessingPluginCLSID Задайте значение в разделе реестра для камеры. INF-файл должен указать CLSID драйвера MFT в разделе реестра классов устройств для устройства, задав CameraPostProcessingPluginCLSID значение GUID CLSID класса MFT драйвера. Ниже приведен пример записи 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 рекомендуется для камер. Обычно вам потребуется только один из разделов реестра в зависимости от того, как устройство зарегистрировано.

Связывание приложения с камерой

В этом разделе содержатся сведения о шагах, необходимых для идентификации камеры в метаданных устройства и в реестре Windows. Эти метаданные позволяют связать приложение устройства UWP и идентифицировать приложение, чтобы его можно было легко скачать при первом подключении камеры.

Обновления

После первой установки приложения, если пользователь скачивает обновленную версию приложения, обновления автоматически интегрируются в интерфейс захвата камеры. Однако обновления не загружаются автоматически. Пользователь должен скачать дополнительные обновления приложений из Microsoft Store, так как приложение автоматически устанавливается только при первом подключении. Главная страница приложения устройства UWP может предоставлять уведомления о доступных обновлениях и предоставлять ссылки на скачивание обновлений.

Важно!

Обновленное приложение должно работать с любыми обновленными драйверами, распределенными через Обновл. Windows.

Несколько камер

Несколько моделей камер могут объявлять одно и то же приложение устройства UWP в метаданных устройства. Если система имеет более одной встроенной камеры, камеры должны совместно использовать одно и то же приложение устройства UWP. Приложение содержит логику определения используемой камеры и может отображать разные пользовательские интерфейсы для каждой камеры в своем интерфейсе "Дополнительные параметры ". Дополнительные сведения о настройке этого интерфейса см. в разделе "Настройка параметров камеры".

Внутренние камеры

Приложения устройств UWP для внутренних камер имеют право на автоматическую установку из Microsoft Store, но рекомендуется предварительно установить их для наиболее простого взаимодействия с пользователем. Существуют дополнительные шаги, необходимые для поддержки внутренних камер и связывания приложения устройства UWP с ними. Дополнительные сведения см. в разделе "Определение расположения внутренних камер".

Создание пакета метаданных устройства

Для внутренних и внешних камер необходимо создать пакет метаданных устройства. При отправке приложения устройства UWP камеры в Microsoft Store (или предустановке его с помощью OPK в случае с внутренними камерами) в дополнение к самому приложению потребуется предоставить метаданные, содержащие следующие:

  • Имя издателя приложения

  • Имя пакета приложения

  • Идентификатор элемента приложения

  • Идентификатор интерфейса устройства

Дополнительные сведения об использовании метаданных устройства для связывания приложения с устройством см. в статье "Создание приложений устройств UWP".

Создание приложений устройств UWP

Автоматическая установка для приложений устройств UWP

Последовательность подтверждения оборудования (аппаратные MFTs)

Руководство по проектированию мини-drivers AVStream

Приложение устройства UWP для примера камеры

Пример MFT драйвера