Регистрация пользовательского типа файла
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]
В этой статье описывается, как диспетчер фильтров Graph находит исходный фильтр с учетом имени файла. Этот механизм можно использовать для регистрации собственных пользовательских типов файлов. После регистрации типа файла DirectShow автоматически загружает правильный фильтр источника всякий раз, когда приложение вызывает IGraphBuilder::RenderFile или IGraphBuilder::AddSourceFilter.
- Обзор
- Протоколы
- Расширения файлов
- Проверка байтов
- Загрузка исходного фильтра
- Пользовательские типы файлов в Медиаплеер Windows
- Связанные темы
Общие сведения
Чтобы найти исходный фильтр по заданному имени файла, диспетчер графа фильтров пытается выполнить следующие действия по порядку:
- Соответствует протоколу , если таковой есть.
- Соответствует расширению файла.
- Сопоставление шаблонов байтов в файле, называемых проверка байтами.
Протоколы
Имена протоколов, такие как "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.
Связанные темы