Идентификатор E436EB83-524F-11CE-9F53-0020AF0BA770 — это зарегистрированный в DirectShow GUID основного типа медиаданных MEDIATYPE_Stream, который появляется в отладчике, логах GraphEdit или в сообщениях об ошибке при попытке соединить два фильтра несовместимыми типами. Если вы видите этот GUID в коде возврата VFW_E_NO_ACCEPTABLE_TYPES или в дампе структуры AM_MEDIA_TYPE, значит один из фильтров графа предлагает сырой поток данных без привязки к конкретному формату аудио или видео.
Разберёмся, что означает этот идентификатор, где он определён в SDK, почему фильтры используют потоковый тип и что делать разработчику или пользователю, когда граф не строится именно на этом этапе согласования форматов.
Что такое majortype в структуре AM_MEDIA_TYPE
В DirectShow каждый выходной пин фильтра описывает передаваемые данные структурой AM_MEDIA_TYPE. Поле majortype в ней задаёт верхнеуровневую категорию потока: видео, аудио, MIDI, текст или универсальный поток. Именно сюда и записывается GUID E436EB83-524F-11CE-9F53-0020AF0BA770, когда фильтр работает с неструктурированным байтовым потоком.
Второе поле — subtype — уточняет формат внутри категории. Для потокового типа подтипом часто выступает MEDIASUBTYPE_NULL (GUID_NULL), что означает: «данные есть, но их внутренний формат фильтром не интерпретируется». Такая пара «majortype Stream + subtype NULL» типична для сплиттеров, источников файлов и сетевых источников.
Третий элемент — formattype — указывает на структуру дополнительных параметров. Для чистого потока обычно используется FORMAT_None, поскольку никаких параметров кадра, битрейта или размеров у сырого байтового потока нет.
Расшифровка GUID E436EB83-524F-11CE-9F53-0020AF0BA770
Константа MEDIATYPE_Stream объявлена в заголовочном файле uuids.h из Windows SDK. Все базовые GUID DirectShow построены на одном шаблоне: первые четыре байта уникальны, а хвост 0000-0010-8000-00AA00389B71 или, как в данном случае, общий суффикс семейства, идентифицирует принадлежность к мультимедийной подсистеме.
Проверить соответствие GUID можно прямо в коде:
if (mt.majortype == MEDIATYPE_Stream)
{
// пин передаёт сырой поток, формат не определён
}
Для ручной сверки удобно инструментом GraphEdit или GraphStudioNext: при наведении на пин фильтра всплывающая подсказка показывает majortype и subtype в текстовом виде, и там же отображается исходный GUID.
Где на практике встречается потоковый majortype
Тип MEDIATYPE_Stream используют компоненты, которые доставляют данные, но не занимаются их интерпретацией. Типичные сценарии:
- 📁 File Source (Async) — читает файл с диска и отдаёт байты дальше по графу, не зная, видео это или субтитры;
- 🌐 сетевые источники и фильтры приёма потока по протоколам, где контейнер ещё не разобран;
- 📦 сплиттеры, выдающие элементарные потоки до момента, когда парсер определит их тип;
- 🔌 пользовательские фильтры-передатчики, пробрасывающие данные между процессами или устройствами.
Важно понимать цепочку: источник отдаёт Stream, парсер или демультиплексор на входе принимает его, а на своих выходах уже предлагает конкретные типы — например, MEDIATYPE_Video с подтипом MEDIASUBTYPE_H264 или MEDIATYPE_Audio с MEDIASUBTYPE_MP3. Если на входе декодера вы видите MEDIATYPE_Stream, значит между источником и декодером отсутствует промежуточный фильтр, распознающий формат.
Почему фильтры не соединяются: диагностика
Наиболее частая жалоба, связанная с этим GUID, — ошибка VFW_E_CANNOT_CONNECT (0x80040217) или VFW_E_NO_ACCEPTABLE_TYPES при вызове IGraphBuilder::Connect или Render. Механика проблемы такова: входной пин нижестоящего фильтра объявляет, что принимает только MEDIATYPE_Video с конкретными подтипами, а выходной пин источника предлагает лишь MEDIATYPE_Stream. Пересечения списков типов нет — соединение отклоняется.
Порядок безопасной диагностики:
- 🔍 перечислите предпочитаемые типы выходного пина через
IPin::EnumMediaTypesи посмотрите, что реально предлагается; - 🔍 аналогично получите список принимаемых типов входного пина;
- 🔍 сравните пары majortype/subtype — совпадение должно быть по обоим полям (или одно из полей должно быть
GUID_NULLкак «джокер»); - 🔍 проверьте, зарегистрирован ли в системе сплиттер/парсер для данного контейнера — без него Intelligent Connect не сможет вставить промежуточное звено.
☑️ Проверка перед соединением фильтров
⚠️ Внимание: не подменяйте majortype вручную в структуре AM_MEDIA_TYPE, чтобы «заставить» пины соединиться. Фильтр, получивший поток не того формата, на который рассчитан, упадёт с ошибкой доступа к памяти уже на этапе обработки сэмплов, и локализовать такой сбой будет гораздо сложнее, чем честную ошибку подключения.
Сравнение основных majortype DirectShow
Чтобы ориентироваться в дампах структур, полезно держать перед глазами базовый набор идентификаторов верхнего уровня.
| Константа | Назначение | Типичный formattype |
|---|---|---|
MEDIATYPE_Video | Кадры видео | FORMAT_VideoInfo |
MEDIATYPE_Audio | Звуковые сэмплы | FORMAT_WaveFormatEx |
MEDIATYPE_Stream | Сырой байтовый поток | FORMAT_None |
MEDIATYPE_Text | Текстовые данные | FORMAT_None |
MEDIATYPE_AUXLine21Data | Скрытые данные строки 21 | FORMAT_None |
Обратите внимание: наличие MEDIATYPE_Stream на пине — это не дефект, а штатный режим работы источников и транспортных фильтров. Проблемой он становится только тогда, когда в графе не находится компонент, способный преобразовать поток в типизированные данные.
Как посмотреть GUID в GraphStudioNext
Откройте граф, щёлкните правой кнопкой по пину и выберите свойства либо просто наведите курсор — всплывающая подсказка покажет Major Type, Sub Type и Format Type в текстовом виде. При попытке соединения несовместимых пинов программа выведет HRESULT и перечень отклонённых типов.
Практические рекомендации для разработчика
Если вы пишете собственный фильтр-источник, решите заранее, что он отдаёт. Когда формат данных известен хотя бы на уровне контейнера, лучше сразу предлагать конкретный subtype вместо связки Stream + NULL — это резко повышает шансы, что Intelligent Connect построит граф автоматически, без ручного указания промежуточных фильтров.
При реализации входного пина, принимающего поток, корректно обрабатывайте метод CheckMediaType: возвращайте S_OK только для тех комбинаций, которые фильтр действительно способен разобрать. Принятие «всего подряд» приводит к падениям на этапе Receive, когда в буфере окажутся данные неожиданной структуры.
Для сценариев, где автопостроение графа не срабатывает, используйте явное добавление фильтров через AddFilter и соединение ConnectDirect с заранее согласованным AM_MEDIA_TYPE. Это детерминированный путь, исключающий зависимость от merit-ранжирования зарегистрированных в системе фильтров.
⚠️ Внимание: сторонние «паки кодеков» перерегистрируют фильтры и меняют их merit, из-за чего граф может начать строиться через другой демультиплексор, и поведение потокового выхода изменится. Диагностику проводите на чистой системе либо фиксируйте построение графа в коде, чтобы результат был воспроизводим.
Когда MEDIATYPE_Stream — признак отсутствующего компонента
Ситуация, требующая вмешательства, выглядит так: RenderFile завершается ошибкой, а при ручном построении видно, что источник выдаёт Stream, и дальше граф не продвигается. Возможная причина — в системе нет фильтра, умеющего парсить данный контейнер или протокол. Проверьте, воспроизводится ли файл в проигрывателе, использующем системный DirectShow: если и там тишина, дело именно в отсутствующем демультиплексоре, а не в вашем коде.
Второй сценарий — файл повреждён или имеет нестандартный заголовок, поэтому парсер отказывается распознавать поток и не регистрирует выходные типы. Здесь помогает проверка того же файла на другом ПК либо получение заведомо исправного образца.
Наконец, если граф строится через сторонний source-фильтр, сверьтесь с его документацией: некоторые фильтры требуют предварительной установки параметров через собственный интерфейс до вызова Connect, и без этого предлагают только универсальный потоковый тип.
Частые вопросы
Что означает GUID E436EB83-524F-11CE-9F53-0020AF0BA770?
Это стандартный идентификатор MEDIATYPE_Stream из DirectShow Windows SDK. Он записывается в поле majortype структуры AM_MEDIA_TYPE, когда фильтр передаёт неструктурированный байтовый поток без указания конкретного формата.
Является ли этот GUID кодом ошибки?
Нет. Это идентификатор типа данных, а не HRESULT. Ошибки подключения имеют собственные коды, например VFW_E_CANNOT_CONNECT (0x80040217), и GUID лишь помогает понять, на согласовании какого типа произошёл отказ.
Почему пин предлагает Stream с subtype NULL?
Так поступают источники и транспортные фильтры, которые не интерпретируют содержимое: файловые источники, сетевые приёмники. Интерпретацию выполняет следующий фильтр в цепочке — парсер или демультиплексор.
Как заставить граф построиться, если соединение отклоняется?
Проверьте наличие подходящего демультиплексора в системе, перечислите медиатипы обоих пинов через EnumMediaTypes и при необходимости добавьте промежуточный фильтр вручную через AddFilter и ConnectDirect с явно согласованным типом.
Где объявлена константа MEDIATYPE_Stream?
В заголовочном файле uuids.h из Windows SDK. Там же объявлены остальные базовые majortype, subtype и formattype, используемые DirectShow.