Регистрация пользовательского типа файла
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен на MediaPlayer, IMFMediaEngineи Захват аудио/видео в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
В этой статье описывается, как менеджер графа фильтров находит исходный фильтр по имени файла. Этот механизм можно использовать для регистрации собственных пользовательских типов файлов. После регистрации типа файла DirectShow автоматически загружает правильный исходный фильтр при вызове приложения IGraphBuilder::RenderFile или IGraphBuilder::AddSourceFilter.
- Обзор
- протоколов
- расширения файлов
- проверка байтов
- загрузка исходного фильтра
- Пользовательские типы файлов в проигрывателе Windows Media
- Связанные темы
Обзор
Чтобы найти исходный фильтр из заданного имени файла, диспетчер графов фильтров пытается выполнить следующее:
- Соответствует протоколу, если таковой есть.
- Соответствует расширению файла.
- Сопоставление шаблонов байтов в файле с именем проверять байты.
Протоколы
Имена протоколов, такие как "ftp" или "http", зарегистрированы в
HKEY_CLASSES_ROOT
ключ со следующей структурой:
HKEY_CLASSES_ROOT
<protocol>
Source Filter = <Source filter CLSID>
Extensions
<.ext1> = <Source filter CLSID>
<.ext2> = <Source filter CLSID>
Если имя файла или URL-адрес содержит двоеточие (":"), диспетчер графов фильтров пытается использовать часть перед именем протокола ":". Например, если имя называется "myprot://myfile.ext", он ищет раздел реестра с именем myprot. Если этот ключ существует и содержит подраздел с именем Extensions, диспетчер фильтров Graph выполняет поиск в этом подразделе для записей, соответствующих расширению файла. Значение ключа должно быть GUID в строковой форме; например, "{00000000-0000-0000-0000-000000000000}". Если диспетчер графов фильтров не может найти совпадений в подразделе Extensions , он ищет подраздел с именем Source Filter , который также должен быть в виде строки GUID.
Если диспетчер графов фильтров находит соответствующий GUID, он использует его в качестве CLSID исходного фильтра и пытается загрузить фильтр. Если он не находит совпадение, он использует фильтр источника файла (URL-адрес), который обрабатывает имя файла как URL-адрес.
Существует два исключения для этого алгоритма:
- Чтобы исключить буквы драйверов, строки с одним символом не считаются протоколами.
- Если строка имеет значение "file:" или "file://", она не рассматривается как протокол.
Расширения файлов
Если в имени файла нет протокола, Диспетчер графа фильтров ищет в реестре записи с ключом HKEY_CLASSES_ROOT\Media Type\Extensions\.ext\, где .ext является расширением файла. Если этот ключ существует, значение фильтр источника содержит CLSID исходного фильтра в строковой форме. При необходимости ключ может содержать значения для типа носителя и подтипа , которые дают GUID основных типов и подтипов.
Проверка байтов
Некоторые типы файлов можно определить определенными шаблонами битов, происходящими при определенных смещениях байтов в файле. Диспетчер графов фильтров ищет в реестре ключи следующего формата.
HKEY_CLASSES_ROOT\MediaType\{ основного типа }\{ подтип }
где основной тип и подтип являются идентификаторами GUID, которые определяют тип носителя для потока байтов. Каждый ключ содержит один или несколько подключей, обычно именованных 1, 2 и т. д., которые определяют контрольные байты; и подключ с именем Фильтр источника, который получает CLSID исходного фильтра в строковой форме. Вложенные ключи check-byte — это строки, содержащие одну или несколько четырех чисел, которые вызываются:
смещения, cb, маски, val
Чтобы сопоставить файл, диспетчер графов фильтров считывает cb bytes, начиная с смещения числа байтов. Затем он выполняет побитовое И с значением в маске. Если результат равен val, файл соответствует указанному квадверу. Значение mask и val заданы в шестнадцатеричном формате. Пустая запись для маски рассматривается как строка единиц длиной cb. Отрицательное значение смещения указывает на смещение от конца файла. Чтобы соответствовать ключу, файл должен соответствовать всем квадрам в любом из подключей.
Например, предположим, что реестр содержит следующие ключи в разделе HKCR\Media Type:
{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.
Загрузка исходного фильтра
Если диспетчер графов фильтров находит соответствующий исходный фильтр для файла, он добавляет этот фильтр в граф, запрашивает фильтр для интерфейса IFileSourceFilter и вызывает IFileSourceFilter::Load. Аргументы метода Load являются именем файла и типом носителя, как определено из реестра.
Если диспетчер графов фильтров не может найти ничего из реестра, по умолчанию используется фильтр источника файла Async. В этом случае он задает тип носителя для MEDIATYPE_Stream, MEDIASUBTYPE_None.
Пользовательские типы файлов в проигрывателе Windows Media
Проигрыватель Windows Media использует дополнительный набор записей реестра. Дополнительные сведения см. в разделе Параметры реестра расширений имен файлов в пакете SDK проигрывателя Windows Media.
Связанные разделы