Majortype MEDIATYPE_Stream: GUID E436EB83-524F-11CE-9F53-0020AF0BA770 в DirectShow

Идентификатор 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 MEDIATYPE_Stream?
В отладчике при разработке фильтра
В GraphEdit/GraphStudioNext
В логах ошибки подключения пинов
Изучаю DirectShow из любопытства

Почему фильтры не соединяются: диагностика

Наиболее частая жалоба, связанная с этим 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 не сможет вставить промежуточное звено.

☑️ Проверка перед соединением фильтров

Выполнено: 0 / 5
⚠️ Внимание: не подменяйте 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Скрытые данные строки 21FORMAT_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.