Введение

Microsoft API

DirectShow (иногда сокращается как DS или DShow), кодовое имя Quartz, — это мультимедийный фреймворк и API, разработанный Microsoft для программных разработчиков для выполнения различных операций с медиафайлами или потоками. Он является заменой более ранней технологии Microsoft Video for Windows. DirectShow, основанный на фреймворке Microsoft Windows Component Object Model (COM), предоставляет общий интерфейс для работы с медиаданными на различных языках программирования и представляет собой расширяемый фреймворк, основанный на фильтрах, который может воспроизводить или записывать медиафайлы по запросу пользователя или разработчика. Инструменты разработки и документация DirectShow первоначально распространялись как часть DirectX SDK. В настоящее время они распространяются как часть Windows SDK (ранее известного как Platform SDK). Microsoft планирует постепенно полностью заменить DirectShow на Media Foundation в будущих версиях Windows. Одной из причин, указанных Microsoft, является обеспечение "значительно более надежной поддержки систем защиты контента" (см. управление цифровыми правами). Бекки Вайс из Microsoft подтвердила в 2006 году, что "вы заметите, что работа с Media Foundation требует работы на немного более низком уровне, чем работа с DirectShow. И некоторые функции DirectShow пока (еще) не реализованы в Media Foundation". Как описано в статье Media Foundation, приложения Windows Vista и Windows 7 используют Media Foundation вместо DirectShow для ряда задач, связанных с мультимедиа.

История

Прямой предшественник DirectShow, ActiveMovie (кодовое название Quartz), был разработан для обеспечения поддержки MPEG 1 в Windows. Он также задумывался как будущая замена для фреймворков обработки мультимедиа, таких как Video for Windows и Media Control Interface, которые так и не были полностью портированы в 32-битную среду и не использовали COM. Проект изначально назывался "ActiveMovie" и был выпущен в мае 1996 года вместе с бета-версией Internet Explorer 3.0. В марте 1997 года Microsoft объявила, что ActiveMovie станет частью пакета технологий DirectX 5, и примерно в июле начала называть его DirectShow, что отражало усилия Microsoft по консолидации технологий, работающих напрямую с аппаратным обеспечением, под единой схемой наименований. DirectShow стал стандартным компонентом всех операционных систем Windows, начиная с Windows 98; однако он доступен и для Windows 95 при установке последней доступной версии распространяемого пакета DirectX. В DirectX версии 8.0 DirectShow стал частью основного DirectX SDK вместе с другими API DirectX. В октябре 2004 года DirectShow был исключен из основного дистрибутива DirectX и перемещен в загрузку DirectX Extras. В апреле 2005 года DirectShow был полностью удален из DirectX и перенесен в Windows SDK, начиная с версии SDK Windows Server 2003 SP1. С ноября 2007 года API DirectShow являются частью Windows SDK. Он включает в себя несколько новых улучшений, кодеков и обновлений фильтров, таких как Enhanced Video Renderer (EVR) и DXVA 2.0 (DirectX Video Acceleration).

Особенности

По умолчанию DirectShow включает в себя ряд фильтров для декодирования распространенных форматов медиафайлов, таких как MPEG 1, MP3, Windows Media Audio, Windows Media Video, MIDI, а также медиаконтейнеров, таких как AVI, ASF, WAV, некоторые сплиттеры/демультиплексоры, мультиплексоры, фильтры-источники и фильтры-приемники, фильтры статических изображений, средства ускорения видео и базовую поддержку управления цифровыми правами (DRM). Стандартный набор поддерживаемых форматов DirectShow можно легко расширить с помощью различных фильтров, что позволяет поддерживать практически любой формат контейнера и любой аудио- или видеокодек. Например, разработаны фильтры для Ogg Vorbis, Musepack и AC3, а кодеки, такие как MPEG 4 Advanced Simple Profile, AAC, H.264, Vorbis, и контейнеры MOV, MP4 доступны от сторонних разработчиков, таких как ffdshow, K Lite и CCCP. Включение поддержки дополнительных кодеков может потребовать оплаты лицензионных сборов разработчику кодека или владельцу патента. Кроме того, существуют "мостовые" фильтры, одновременно поддерживающие несколько форматов, а также функции мультиплексирования потоков, реализующие функциональность базовых мультимедийных API, таких как VLC. Объем работы, необходимый для реализации графа фильтров, зависит от нескольких факторов. В простейшем случае DirectShow может автоматически создать граф фильтров из источника, например, файла или URL. Если это невозможно, разработчик может вручную создать граф фильтров из исходного файла, возможно, добавив пользовательский фильтр, а затем позволить DirectShow завершить построение графа, соединив фильтры. На следующем уровне разработчик должен построить граф фильтров с нуля, вручную добавляя и соединяя каждый необходимый фильтр. Наконец, если необходимый фильтр недоступен, разработчик должен создать пользовательский фильтр, прежде чем можно будет построить граф фильтров. В отличие от основного C API QuickTime, где для загрузки медиафайла необходимо вызывать MoviesTask в цикле, DirectShow обрабатывает все это прозрачно. Он создает несколько фоновых потоков, которые плавно воспроизводят запрошенный файл или URL, не требуя значительных усилий от программиста. Также, в отличие от QuickTime, для загрузки URL вместо локального файла на диске не требуется никаких специальных действий. Граф фильтров DirectShow абстрагирует эти детали от программиста, хотя недавние разработки QuickTime (включая ActiveX-элемент управления) несколько уменьшили эту разницу.

Услуги редактирования DirectShow

DirectShow Editing Services (DES), представленный в DirectX 8.0/Windows XP, — это API, предназначенный для задач видеомонтажа и построенный на основе основной архитектуры DirectShow. DirectShow Editing Services был разработан для Microsoft Windows Movie Maker. Кроме того, ко всему API DirectShow, включая DirectShow Editing Services, можно получить доступ из Borland Delphi 5, 6 и 7, C++ Builder 6, а также из более поздних версий с некоторыми незначительными изменениями, используя стороннюю программную библиотеку под названием "DSPack". По состоянию на март 2012 года (и, судя по всему, еще с 2009 года) Microsoft заявила, что API DirectShow Editing Services "не поддерживается и может быть изменен или удален в будущем".

Фильтры для рендеринга видео

Первоначально в Windows 9x DirectShow использовал фильтр Video Renderer. Он отрисовывал изображения с помощью DirectDraw 3, но в некоторых случаях мог переключаться на GDI или режимы рисования с наложением (в зависимости от видимости видеоокна и возможностей видеокарты). Доступ к видеоокну был ограничен. Видео для Windows часто страдало от взаимоблокировок, вызванных некорректной обработкой видеоокон приложениями, поэтому в ранних версиях DirectShow дескриптор окна воспроизведения был скрыт от приложений. Также отсутствовал надежный способ рисования текста субтитров или графики поверх видео. DirectShow 6.0, выпущенный в составе DirectX Media, представил рендерер Overlay Mixer, предназначенный для воспроизведения DVD и трансляции видеопотоков с закрытыми субтитрами и титрами. Overlay Mixer использует DirectDraw 5 для отрисовки. Он также предлагал "режим без окна" (доступ к составному изображению до его отрисовки), который устранял проблемы с доступом к дескриптору окна. DirectX 9 представил VMR 9, который входит в состав Windows XP SP2 и более поздних версий. Эта версия использует Direct3D 9 вместо DirectDraw, что позволяет разработчикам преобразовывать видеоизображения с помощью пиксельных шейдеров Direct3D. Он доступен для всех платформ Windows как часть распространяемого пакета DirectX 9. Как и VMR 7, он предоставляет режим без окна. Однако, в отличие от Overlay Mixer или VMR 7, он не поддерживает видеопорты. Использование параметра загрузки /3GB может привести к сбоям в работе VMR 9. Windows Vista и Windows 7 поставляются с новым рендерером, доступным как компонент Media Foundation, так и фильтр DirectShow, под названием Enhanced Video Renderer (EVR). EVR разработан для работы с Desktop Window Manager и поддерживает DXVA 2.0, доступный в Windows Vista и Windows 7. По утверждению Microsoft, он обеспечивает более высокую производительность и лучшее качество изображения.

Награды

8 января 2007 года Microsoft получила премию «Эмми» за архитектуры и компоненты потокового мультимедиа на 58-й ежегодной церемонии вручения премии «Эмми» в области технологий и инженерии.

Простота

Команда DirectShow для воспроизведения файла – относительно простая задача. Однако при программировании более сложных настроек, таких как указание DirectShow отображать определенные сообщения Windows из окна видео или создание пользовательских фильтров, многие разработчики сталкиваются с трудностями. DirectShow считается одним из самых сложных наборов библиотек разработки/API от Microsoft. Разработчики редко создают фильтры DirectShow с нуля, предпочитая использовать базовые классы DirectShow. Эти базовые классы часто упрощают разработку, позволяя программисту избегать выполнения определенных задач. Тем не менее, процесс может оставаться достаточно сложным, поскольку код в базовых классах составляет почти половину размера всей библиотеки MFC. В результате, даже при использовании базовых классов, количество COM-объектов, содержащихся в DirectShow, часто ошеломляет разработчиков. В некоторых случаях API DirectShow отходит от традиционных правил COM, особенно в отношении параметров, используемых в методах. Чтобы справиться с особенностями COM в DirectShow, разработчики часто обращаются к API более высокого уровня, использующему DirectShow, например, к SDK Windows Media Player, который предоставляет разработчику ActiveX Control с меньшим количеством COM-интерфейсов для работы. Хотя DirectShow способен динамически строить граф для воспроизведения определенного типа медиа, в некоторых случаях разработчикам сложно полагаться на эту функциональность, и им приходится вручную создавать фильтрующие графы, если результирующий граф может изменяться. Фильтрующие графы могут меняться со временем по мере установки новых фильтров на компьютер.

Кодековый ад

Кодексный ад (термин, образованный от "DLL hell") возникает, когда несколько фильтров DirectShow конфликтуют при выполнении одной и той же задачи. Многие компании сейчас разрабатывают кодеки в виде фильтров DirectShow, что приводит к появлению нескольких фильтров, способных декодировать один и тот же тип медиаданных. Эта проблема усугубляется системой приоритетов DirectShow, в которой реализации фильтров конкурируют друг с другом, регистрируясь с постоянно возрастающим приоритетом. GraphEdit также может помочь понять последовательность фильтров, используемую DirectShow для воспроизведения медиафайла. Решить проблему кодексного ада можно, создавая графы фильтров вручную, используя медиаплеер, поддерживающий игнорирование или переопределение приоритетов фильтров, или с помощью менеджера фильтров, изменяющего приоритеты фильтров в реестре Windows.

Инструменты для конечных пользователей

DirectShow, будучи фреймворком и API, ориентированным на разработчиков, не предоставляет конечным пользователям прямого управления кодированием контента и не включает в себя пользовательский интерфейс для кодирования с использованием установленных кодеков или преобразования в различные форматы. Вместо этого он предполагает, что разработчики будут создавать программное обеспечение с использованием этого API. В отличие от этого, другие мультимедийные фреймворки, такие как QuickTime или Video for Windows, позволяют конечным пользователям выполнять базовые видеозадачи, такие как перекодирование с использованием другого кодека и редактирование файлов и потоков. Удобство, обеспечиваемое пользовательским графическим интерфейсом, очевидно, поскольку формат AVI и кодеки, используемые Video for Windows, до сих пор остаются в употреблении, например, в VirtualDub.