Что такое DirectShow? Что такое фильтр?


Что такое DirectShow?

Microsoft выпустила Video for Windows 1.x в ноябре 1992 года для Windows 3.1 в оптимизированном виде для захвата видео и сохранения его на диск. С тех пор показатели видеозахвата очень серьезно улучшились благодаря использованию шины PCI, bus mastering controllers, NT striped sets, Fast/Wide SCSI и прямой передачи захваченного видео из памяти адаптера на диск без промежуточного копирования данных в память. Несмотря на характеристики захвата, превышающие сейчас 20 мегабайт в секунду и большое количество клиентов для VfW, недостатки в архитектуре VfW с точки зрения необходимости поддержки видеоконференций потребовали разработки новой технологии видеозахвата.

Архитектуре VfW недостает важных свойтсв с точки зрения видеоконференций, телевизионного просмотра, захвата видеополей и поддержки дополнительных потоков данных таких, как VBI - vertical blanking interval - вертикальных интервалов гашения. Разнообразные производители расширили VfW путем реализации дополнительных возможностей. Однако, без стандартизации интерфейсов, приложения, использующие эти возможности, должны включать аппаратно-зависимый код. Тесная связь между драйверами захвата VfW и и драйверами дисплея значит то, что изменения, внесенные в драйвера захвата, требуют изменений и для драйверов дисплея.

Вдобавок, интерфейс VfW, AVICap не очень хорошо работает с DirectShow, поскольку AVICap распределяет буфера. Если к DirectShow доступаться через AVICap, буфера должны быть скопированы в точке передачи, что очень неэффективно. Для интеграции DVD, MPEG декодеров, видео-декодеров и тюнеров, расширений видеопортов (video port extensions - VPE) и аудио-кодеров на одном адаптере, необходима унифицированная драйверная модель, поддерживающая все эти устройства и управляющая их ресурсами.

DirectShow - это API, позволяющий Windows-приложениям управлять широким спектром устройств аудио/видео ввода, включающий (но не ограниченный) DV камеры, веб-камеры, DVD-устройства, карты TV-тюнеров. Оно поддерживает также различные форматы, от WAV и AVI до Windows Media. DirectShow, кроме этого, расширяемо, оно позволяет поддерживать устройства третьих производителей, форматы и компоненты обработки.

DirectShow предлагает как высокоуровневую модель приложения, позволяющую быстро разрабатывать цифровые медиаприложения, так и низкоуровневую классовую модель, позволяющую третьим производителям создавать собственные компоненты аудио и видео обработки.

Необходимо немного сказать об эволюции DirectShow. Она началась с поддержки в Windows 3.1 видеозахвата, предоставляемого моделью Видео для Windows (Video for Windows -VfW). VfW была прогрессивной технологией для своего времени, но имела серьезные ограничения. Одним из них было то, что менеджер видеокомпрессии (Video Compression Manager - VCM) не был разработан для управлениями кодеками, которые бы передавали видеофреймы в разном порядке во время сжатия. Таким образом, было затруднительно писать MPEG-кодеки, базирующиеся на VCM.

Windows также предоставлял простую поддержку аудио и видео проигрывания через набор команд MCI - Media Control Interface, который использовался драйверами mciavi. Хотя инфраструктура MCI допускала MPEG-декодеры, она никогда не была полностью портирована на 32-юитную архитектуру, и не базировалась на COM. Для снятия этих ограничений Microsoft начала проект, известный под названием Quartz, в котором была заложена поддержка проигрывания MPEG-1 для Windows.

В то время возникало множество новых устройств, таких, как цифровых видеокамер, новые медиформаты, такие, как MPEG-2 или DVD, и новые технологии, такие, как видеоконференции. Становилась понятной необходимость новой оболочки, позволяющей заставить работать вместе эти новые технологии максимально эффективно не только каждую саму по себе, но и под единым началом. Эта оболочка должна была быть расширяемое, чтобы третьи производители могли осуществлять поддержку своих специальных аппаратных средств, нестандартных форматов и процессов программной обработки. Эта оболочка должна была бы максимально упростить разработку программ, предоставить возможность низкоуровневого управления потоковыми операциями и модифицировать необходимые аудио и видео данные.

Для соответствия этим многочисленным требованиям группа разработчиков проекта Quartz начала с существующего проекта Clockwork. Clockwork был модульной оболочкой, в которой совместно работали полунезависимые компоненты, следуя предписаниям набора правил, для обработки медиапотоков. Группа разработчиков Quartz'а адаптировала эту модель для работы с Windows и обеспечила поддержку устройств третьих производителей. Результатом стала базирующуяся на COM потоковая архитектура, которая через шесть лет стала базисом сотен приложений под Windows.

Эта архитектура первоначально называлась ActiveMovie и впервые появилась в 1995 году с DirectX SDK. В 1996 году ActiveMovie была переименована в DirectShow. В 1998 году, вместе с DirectX Media 6.1, была добавлена поддержка для DVD и приложений аналогового телевидения. В 2000 году DirectShow стала частью DirectX SDK в составе DirectX 8.0, и допоолнительно стала поддерживать Windows Media Format, DirectShow Editing Services и API видеоредактирования.

Что такое фильтр?

Цифровые видеопотоки представляют собой последовательности видеофреймов, которые могут быть несжатыми RGB-изображениями или, если поток сжат, набором цировых значений, который можно декодировать для получения изображения. Обычно видео проигрывается со скоростью 25 или 30 кадров в секунду. Несжатый цифровой аудиопоток содержит последовательность значений, кождое из которых есть целым, представляющую из себя квантованную (округленную) амплитуду аналогового сигнала в определенный момент времени. При качестве CD-аудио данные имеют точность 16 бит на отсчет и записываются и воспроизводятся как звук максимальной частоты 44,1 килогерц. Сжатый видеопоток не содержит действительных последовательностей данных, но, как и видеопоток, содержит значения, которые декодер использует для восстановления исходного потока перед тем, как подать его в звуковую карту.

Аудио и видеопотоки могут быть обработаны самыми разными способами. Они могут быть скомбинированы, проанализированы, перемешаны, скопированы, сгенерированы, изменены и т.д. В DirectShow все эти операции скрыты в фильтрах - COM-объектах, имеющих стандартное поведение. Фильтры, читающие файлы, расщепляющие бинарные данные на разные (например, аудио и видео) потоки - демультиплексоры, фильтры-компрессоры и фильтры-декомпрессоры, фильтры, отображающие аудио или видеоданные, фильтры - драйверы устройств - все это фильтры, которые знают, как они должны взаимодействовать, кроме обработки данных, - с другими фильтрами - для передачи потоковых данных. Приложения соединяют эти фильтры в необходимом порядке.

Фильтры могут быть трех основных типов: фильтры источников для ввода, фильтры преобразования для обработки и фильтры рендеринга для отображения информации.

Фильтр источника вводит данные в поток. Эти данные он может получать из файла или, например, видеокамеры, веб-камеры, TV-тюнера, сетевого потока и т.д. DirectShow тесно связана с моделью Windows-драйвером (Windows Driver Model - WDM); любое медиаустройство с правильно реализованным WDM-драйвером автоматически предоставляется для приложения как DirectShow фильтр источника. DirectShow предоставляет также фильтры источников для ввода данных из файлов, DVD- и VfW-устройств.

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

Фильтры рендеринга принимают данные от фильтров источников или преобразования и отображают их на экране, выводят через колонки, в файлы, устройства и т.д. Часть "Direct" в названии "DirectShow" отражает тот факт, что фильтры рендеринга используют технологии DirectDraw и DirectSound для передачи данных в видео- и звуковую карту. Вдобавок DirectShow поддерживает свойства потокого ядра, что позволяет таким устройствам захвата, как ТВ-тюнеры и DVD-устройства передавать данные на внешние устройства в режиме ядра для сохранения расходов переходов из режима ядра в пользовательский режим в случаях, когда приложение не требует этих данных.

Ниже приведена схема фильтров и их соединения при проигрывании avi-файла:

Здесь фильтром источника есть File Source (Async), фильтами рендеринга - Video Renderer и Default DirectSound Device, а фильтами преобразования - AVI Splitter и AVI Decompressor.

Для кого эта статья?

В первую очередь, для тех, кто задает на форумах вопросы вроде:

  • Кто знает как передавать потоковое видео по локальной сети с тв-тюнера, по TCP/IP или по HTTP?
  • Хто знает где можно получить инфу о написание видео проигрывателя?
  • Моя программа выводит видео с захватывающего устройства. Пользователь нажимает кнопку и с живого видео выдергивается стопкадр. Проблема в том, что ...

За один месяц на медиа-форуме мастеров дельфи я насчитал вопросов, связанных с видео, касающихся DirectShow, около 15 (при общем их количестве ~120, т.е. 12,5%). При этом сознательно не касаюсь вопросов о звуке, поскольку сам звуковой тематикой вплотную не занимался. Впрочем, с точки зрения конечного программиста, эта статья покрывает достаточно много вопросов начинающих о работе со звуком. Т.е. эта статья может быть потенциально интересна четверти медиа-вопрошающих.

Comments