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


Регистрация пользовательского типа файла

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

В этой статье описывается, как диспетчер фильтров Graph находит исходный фильтр с учетом имени файла. Этот механизм можно использовать для регистрации собственных пользовательских типов файлов. После регистрации типа файла DirectShow автоматически загружает правильный фильтр источника всякий раз, когда приложение вызывает IGraphBuilder::RenderFile или IGraphBuilder::AddSourceFilter.

Общие сведения

Чтобы найти исходный фильтр по заданному имени файла, диспетчер графа фильтров пытается выполнить следующие действия по порядку:

  1. Соответствует протоколу , если таковой есть.
  2. Соответствует расширению файла.
  3. Сопоставление шаблонов байтов в файле, называемых проверка байтами.

Протоколы

Имена протоколов, такие как "ftp" или "http", регистрируются в

HKEY_CLASSES_ROOT

ключ со следующей структурой:

HKEY_CLASSES_ROOT
    <protocol>
        Source Filter = <Source filter CLSID>
        Extensions
            <.ext1> = <Source filter CLSID>
            <.ext2> = <Source filter CLSID>

Если имя файла или URL-адрес содержит двоеточие (':'), диспетчер фильтров graph пытается использовать часть перед ":" в качестве имени протокола. Например, если имя — "myprot://myfile.ext", выполняется поиск раздела реестра с именем myprot. Если этот ключ существует и содержит подраздел с именем Extensions, диспетчер фильтров Graph выполняет поиск записей, соответствующих расширению файла, в этом подразделе. Значение ключа должно быть GUID в строковой форме; например, "{00000000-0000-0000-0000-000000000000}". Если диспетчер графов фильтров не может сопоставить ничего в подразделе Extensions , он ищет подраздел с именем Фильтр источника, который также должен быть GUID в строковой форме.

Если диспетчер графов фильтров находит соответствующий GUID, он использует его в качестве ИДЕНТИФИКАТОРа CLSID исходного фильтра и пытается загрузить фильтр. Если не найти совпадение, используется фильтр "Источник файла (URL-адрес), который обрабатывает имя файла как URL-адрес.

Существует два исключения из этого алгоритма:

  • Чтобы исключить буквы драйвера, односимвленные строки не считаются протоколами.
  • Если строка имеет значение "file:" или "file://", она не рассматривается как протокол.

Расширения файлов

Если в имени файла нет протокола, диспетчер графов фильтров ищет в реестре записи с ключом HKEY_CLASSES_ROOT\Media Type\Extensions\. ext\, где . ext — это расширение файла. Если этот ключ существует, значение Source Filter содержит ИДЕНТИФИКАТОР CLSID исходного фильтра в строковой форме. При необходимости ключ может иметь значения типа носителя и подтипа, которые дают идентификаторы GUID основного типа и подтипа.

Проверка байтов

Некоторые типы файлов можно определить по определенным шаблонам битов, происходящих с определенными смещениями байтов в файле. Диспетчер графов фильтров ищет ключи в реестре в следующей форме:

HKEY_CLASSES_ROOT\MediaType\{ основной тип }\{ подтип }

где основной тип и подтип — это идентификаторы GUID, определяющие тип мультимедиа для потока байтов. Каждый ключ содержит один или несколько подразделов с именами 1, 2 и т. д., которые определяют проверка байтов, и подраздел с именем Source Filter, который предоставляет идентификатор CLSID исходного фильтра в строковой форме. Подразделы проверка байтов представляют собой строки, содержащие один или несколько четырех четырех чисел:

offset, cb, mask, val

Для сопоставления с файлом диспетчер графов фильтров считывает cb байты, начиная со смещения числа байтов. Затем он выполняет побитовое и против значения в маске. Если результат равен val, файл является совпадением для этого четырехугольника. Значения mask и val задаются в шестнадцатеричном формате. Пустая запись для маски рассматривается как строка длиной 1 см в кб. Отрицательное значение offset указывает на смещение от конца файла. Чтобы сопоставить ключ, файл должен соответствовать всем четырехключам в любом из подразделов.

Например, предположим, что реестр содержит следующие разделы в разделе HKCR\Тип носителя:

{e436eb83-524f-11ce-9f53-0020af0ba770}
    {7364696D-0000-0010-8000-00AA00389B71}
        0                    "0,4,,52494646,8,4,,524D4944"
        1                    "0,4,,4D546864"
        Source Filter        "{E436EBB5-524F-11CE-9F53-0020AF0BA770}"

Первый ключ соответствует основному типу MEDIATYPE_Stream. Подраздел ниже, соответствующий подтипу MEDIATYPE_Midi. Значение подраздела Фильтр источника — CLSID_AsyncReader, CLSID фильтра источника файлов (Асинхронный).

Каждая запись может иметь несколько четырехкратных; все они должны совпадать. В следующем примере первые 4 байта файла должны быть 0xAB, 0xCD, 0x12 0x34; и последние 4 байта файла должны быть 0xAB, 0xAB, 0x00 0xAB:

    0, 4, , ABCD1234,  -4, 4, , ABAB00AB 

Кроме того, в одном типе мультимедиа может быть указано несколько записей. Достаточно совпадения с любым из них. Эта схема позволяет использовать набор альтернативных масок; например, WAV-файлы, которые могут иметь или не иметь заголовок RIFF.

Примечание

Эта схема аналогична схеме, используемой функцией GetClassFile .

 

Загрузка исходного фильтра

Предполагая, что диспетчер графов фильтров находит соответствующий исходный фильтр для файла, он добавляет этот фильтр в граф, запрашивает фильтр для интерфейса IFileSourceFilter и вызывает IFileSourceFilter::Load. Аргументами метода Load являются имя файла и тип носителя, как определено из реестра.

Если диспетчеру графов фильтров не удается найти ничего из реестра, по умолчанию используется фильтр источника асинхронного файла. В этом случае он задает тип носителя MEDIATYPE_Stream, MEDIASUBTYPE_None.

Пользовательские типы файлов в Медиаплеер Windows

Медиаплеер Windows использует дополнительный набор записей реестра. Дополнительные сведения см. в разделе Параметры реестра расширения имени файла пакета SDK для Медиаплеер Windows.

Написание фильтров DirectShow