DirectShow (иногда сокращенно DS или DShow ), кодовое название Quartz , представляет собой мультимедийную инфраструктуру и API, разработанные Microsoft для разработчиков программного обеспечения для выполнения различных операций с медиафайлами или потоками. Это замена более ранней технологии Microsoft Video for Windows . [1] Основанный на инфраструктуре Microsoft Windows Component Object Model (COM), DirectShow предоставляет общий интерфейс для мультимедиа на различных языках программирования и является расширяемой инфраструктурой на основе фильтров , которая может отображать или записывать медиафайлы по требованию пользователя или разработчика. Инструменты разработки и документация DirectShow изначально распространялись как часть DirectX SDK . [2] В настоящее время они распространяются как часть Windows SDK (ранее известного как Platform SDK). [3]
Microsoft планирует постепенно полностью заменить DirectShow на Media Foundation в будущих версиях Windows. Одной из причин, названных Microsoft, является предоставление «гораздо более надежной поддержки для систем защиты контента» [4] (см. управление цифровыми правами ). Бекки Вайс из Microsoft подтвердила в 2006 году, что «вы заметите, что работа с Media Foundation требует от вас работы на несколько более низком уровне, чем работа с DirectShow. И все еще есть функции DirectShow, которых (пока) нет в Media Foundation». [4] [5] Как описано в статье Media Foundation, приложения Windows Vista и Windows 7 используют Media Foundation вместо DirectShow для нескольких задач, связанных с мультимедиа.
Прямой предшественник DirectShow, ActiveMovie (кодовое название Quartz), был разработан для обеспечения поддержки MPEG-1 для Windows. Он также был задуман как будущая замена для фреймворков обработки медиа, таких как Video for Windows и Media Control Interface , которые никогда не были полностью перенесены в 32-битную среду и не использовали COM. [6] [1]
Команда разработчиков использовала уже существующий проект модульного цифрового медиапроцессора под кодовым названием «Clockwork» в качестве основы для DirectShow. Ранее Clockwork использовался в проекте Microsoft Interactive Television. [7]
Первоначально проект назывался «ActiveMovie» и был выпущен в мае 1996 года вместе с бета-версией Internet Explorer 3.0 . [8] [9] В марте 1997 года Microsoft объявила, что ActiveMovie станет частью набора технологий DirectX 5, и примерно в июле начала называть его DirectShow, что отражало усилия Microsoft в то время по консолидации технологий, которые работали напрямую с оборудованием, в рамках общей схемы именования. [10] [11] [12] DirectShow стал стандартным компонентом всех операционных систем Windows, начиная с Windows 98 ; [13] однако он доступен в Windows 95 после установки последней доступной распространяемой версии DirectX. [14] В DirectX версии 8.0 DirectShow стал частью основного DirectX SDK вместе с другими API DirectX. [15]
В октябре 2004 года DirectShow был удалён из основного дистрибутива DirectX и перемещён в загрузку DirectX Extras. [ требуется ссылка ] В апреле 2005 года DirectShow был полностью удалён из DirectX и перемещён в Windows SDK, начиная с версии SDK для Windows Server 2003 SP1. [3] Однако DirectX SDK по-прежнему требовался для сборки некоторых примеров DirectShow. [16]
С ноября 2007 года API DirectShow являются частью Windows SDK . Он включает несколько новых улучшений, кодеков и обновлений фильтров, таких как Enhanced Video Renderer (EVR) и DXVA 2.0 ( DirectX Video Acceleration ). [17]
DirectShow разделяет сложную мультимедийную задачу (например, воспроизведение видео) на последовательность основных этапов обработки, известных как фильтры . [18] [19] Каждый фильтр, представляющий один этап обработки данных, имеет входные и/или выходные контакты , которые могут использоваться для подключения фильтра к другим фильтрам. Универсальная природа этого механизма подключения позволяет подключать фильтры различными способами, чтобы реализовывать различные сложные функции. [20] Чтобы реализовать определенную сложную задачу, разработчик должен сначала построить граф фильтров , создав экземпляры требуемых фильтров, а затем соединив фильтры вместе. [21]
Существует три основных типа фильтров:
В процессе рендеринга граф фильтров ищет в реестре Windows зарегистрированные фильтры и строит свой граф фильтров на основе предоставленных местоположений. После этого он соединяет фильтры вместе и, по запросу разработчика, выполняет (т. е. воспроизводит, приостанавливает и т. д.) созданный граф. [ необходима цитата ] Графы фильтров DirectShow широко используются в воспроизведении видео (в котором фильтры реализуют такие функции, как анализ файлов, демультиплексирование видео и аудио, распаковка и рендеринг), а также для записи видео и аудио, редактирования, кодирования, транскодирования или сетевой передачи мультимедиа. Интерактивные задачи, такие как навигация по DVD, также могут контролироваться DirectShow. [ необходима цитата ]
В приведенном выше примере слева направо график содержит исходный фильтр для чтения файла MP3, разделитель потока и фильтры декодера для разбора и декодирования аудио, а также фильтр рендеринга для воспроизведения необработанных аудиосэмплов. Каждый фильтр имеет один или несколько контактов, которые можно использовать для подключения этого фильтра к другим фильтрам. Каждый контакт функционирует либо как выходной, либо как входной источник для передачи данных от одного фильтра к другому. В зависимости от фильтра данные либо «вытягиваются» из входного контакта, либо «проталкиваются» на выходной контакт для передачи данных между фильтрами. Каждый контакт может подключаться только к одному другому контакту, и они должны согласовать, какие данные они отправляют. [ необходима цитата ]
Большинство фильтров создаются с использованием набора классов C++, представленных в DirectShow SDK, называемых базовыми классами DirectShow. [ требуется цитата ] Они обрабатывают большую часть логики создания, регистрации и подключения для фильтра. [23] Чтобы граф фильтров автоматически использовал фильтры, их необходимо зарегистрировать в отдельной записи реестра DirectShow, а также зарегистрировать в COM. Эта регистрация может управляться базовыми классами DirectShow. Однако, если приложение добавляет фильтры вручную, их вообще не нужно регистрировать. [ требуется цитата ] К сожалению, сложно изменить граф, который уже запущен. Обычно проще остановить граф и создать новый граф с нуля. Начиная с DirectShow 8.0, были введены динамическое построение графа, динамическое повторное подключение и цепочки фильтров, чтобы помочь изменить граф во время его работы. [24] Однако многие поставщики фильтров игнорируют эту функцию, что делает изменение графа проблематичным после начала обработки графа. [ требуется цитата ]
Хотя DirectShow способен динамически строить график для визуализации заданного типа мультимедиа, в некоторых случаях разработчикам сложно полагаться на эту функциональность, и им приходится прибегать к ручному построению графиков фильтров, если результирующий график фильтров является переменным. [ необходима цитата ] Графики фильтров могут со временем меняться по мере установки новых фильтров на компьютер. [ необходима цитата ]
По умолчанию DirectShow включает в себя ряд фильтров для декодирования некоторых распространенных форматов медиафайлов, таких как MPEG-1 , MP3 , Windows Media Audio , Windows Media Video , MIDI , медиаконтейнеров , таких как AVI , ASF , WAV , некоторых разделителей/демультиплексоров, мультиплексоров, фильтров источника и приемника , некоторых фильтров статических изображений, некоторого ускорения видео и минимальной поддержки управления цифровыми правами (DRM). [25] [26] Стандартный репертуар форматов DirectShow можно легко расширить с помощью различных фильтров, что позволяет DirectShow поддерживать практически любой формат контейнера и любой аудио- или видеокодек. Например, фильтры были разработаны для Ogg Vorbis , Musepack и AC3 , а некоторые кодеки, такие как MPEG-4 Advanced Simple Profile , AAC , H.264 , Vorbis и контейнеры MOV , MP4 доступны у сторонних поставщиков, таких как ffdshow , K-Lite и CCCP . [27] [28] [29] Включение поддержки дополнительных кодеков, таких как эти, может включать оплату лицензионных сборов разработчику технологии кодека или владельцу патента. [ необходима ссылка ] Наконец, существуют «мостовые» фильтры, которые одновременно поддерживают несколько форматов, а также такие функции, как потоковое мультиплексирование, раскрывая функциональность базовых мультимедийных API, таких как VLC . [30]
Объем работы, требуемый для реализации графа фильтра, зависит от нескольких факторов. В простейшем случае DirectShow может автоматически создать граф фильтра из источника, такого как файл или URL. [31] Если это невозможно, разработчик может вручную создать граф фильтра из исходного файла, возможно, с добавлением пользовательского фильтра, а затем позволить DirectShow завершить граф фильтра, соединив фильтры вместе. На следующем уровне разработчик должен построить граф фильтра с нуля, вручную добавив и соединив каждый желаемый фильтр. Наконец, в случаях, когда необходимый фильтр недоступен, разработчик должен создать пользовательский фильтр, прежде чем можно будет построить граф фильтра. [ необходима цитата ]
В отличие от основного API C QuickTime, где необходимо вызывать MoviesTask в цикле для загрузки медиафайла, DirectShow обрабатывает все это прозрачным образом. Он создает несколько фоновых потоков, которые плавно воспроизводят запрошенный файл или URL без особых усилий со стороны программиста. [ требуется цитата ] Также в отличие от QuickTime, ничего особенного не требуется для загрузки URL вместо локального файла на диске — график фильтра DirectShow абстрагирует эти детали от программиста, хотя последние разработки в QuickTime (включая элемент управления ActiveX ) уменьшили это несоответствие. [ требуется цитата ]
DirectShow Editing Services (DES), представленный в DirectX 8.0/ Windows XP, представляет собой API, ориентированный на задачи редактирования видео и построенный поверх базовой архитектуры DirectShow. DirectShow Editing Services был представлен для Microsoft Windows Movie Maker . [1] Он включает API для временной шкалы и служб переключения, изменения размера, обрезки, видео- и аудиоэффектов, а также переходов, кеинга , автоматического преобразования частоты кадров и частоты дискретизации и других функций, которые используются в нелинейном видеоредактировании, позволяя создавать композитные медиа из нескольких исходных аудио- и видеопотоков. DirectShow Editing Services позволяет выполнять высокоуровневую композицию во время выполнения, искать поддержку и управлять графикой, при этом позволяя приложениям получать доступ к низкоуровневым функциям DirectShow.
Хотя оригинальный API написан на C++, DirectShow Editing Services доступен на любом языке, совместимом с Microsoft .NET, включая Microsoft Visual C# и Microsoft Visual Basic , с помощью сторонней библиотеки кода под названием «DirectShowNet Library». [32] В качестве альтернативы, весь DirectShow API, включая DirectShow Editing Services, может быть доступен из Borland Delphi 5, 6 и 7, C++ Builder 6 и из более поздних версий с несколькими незначительными изменениями, с помощью сторонней библиотеки программного обеспечения под названием «DSPack». [33]
По состоянию на март 2012 года [34] (и, по-видимому, ещё в 2009 году [35] ) компания Microsoft заявила, что DirectShow Editing Services «API не поддерживается и может быть изменен или недоступен в будущем».
Первоначально в Windows 9x DirectShow использовал фильтр Video Renderer . Он рисовал изображения с помощью DirectDraw 3, но также мог возвращаться к режимам GDI или наложения в некоторых обстоятельствах (в зависимости от видимости видеоокна и возможностей видеокарты). [14] [36] Он имел ограниченный доступ к видеоокну. [ необходима цитата ] Видео для Windows страдало от взаимоблокировок, вызванных неправильной обработкой видеоокна приложениями, поэтому в ранних выпусках DirectShow дескриптор окна воспроизведения был скрыт от приложений. Также не было надежного способа рисовать текст субтитров или графику поверх видео. [ необходима цитата ]
DirectShow 6.0, выпущенный как часть DirectX Media, представил рендерер Overlay Mixer, предназначенный для воспроизведения DVD и трансляции видеопотоков с субтитрами и скрытыми субтитрами . [ требуется ссылка ] Overlay Mixer использует DirectDraw 5 для рендеринга. [14] Для управления окнами требуется нисходящее соединение с Video Renderer . [ требуется ссылка ] Overlay Mixer также поддерживает Video Port Extensions (VPE), что позволяет ему работать с аналоговыми ТВ-тюнерами с возможностью наложения (отправка видео напрямую на видеокарту через аналоговый канал, а не через шину PCI ). Overlay Mixer также поддерживает соединения DXVA . [ требуется ссылка ] Поскольку он всегда рендерит в режиме наложения , полноэкранное видео на ТВ-выход всегда активировано.
Начиная с Windows XP , был представлен новый фильтр под названием Video Mixing Renderer 7 ( VMR-7 или иногда просто VMR ). Номер 7 был выбран потому, что VMR-7 использовал только DirectDraw версии 7 для рендеринга видео и не имел возможности использовать GDI-рисование. Главной новой функцией VMR-7 была возможность смешивать несколько потоков и графику с альфа-смешением, что позволяло приложениям рисовать текст и графику поверх видео и поддерживать пользовательские эффекты. [37] Он также имел «безоконный режим» (доступ к составному изображению до его рендеринга), который исправлял проблемы с доступом к дескриптору окна. [38]
DirectX 9 представил VMR-9 , который включен в Windows XP SP2 и более поздние версии. [39] Эта версия использует Direct3D 9 вместо DirectDraw, что позволяет разработчикам преобразовывать видеоизображения с помощью пиксельных шейдеров Direct3D. [40] Он доступен для всех платформ Windows как часть распространяемого пакета DirectX 9. [ требуется ссылка ] Как и VMR-7, он обеспечивает безоконный режим. Однако, в отличие от микшера Overlay или VMR-7, он не поддерживает видеопорты. [41] Использование параметра загрузки /3GB может привести к сбою VMR-9. [42]
Windows Vista и Windows 7 поставляются с новым рендерером, доступным как компонент Media Foundation и фильтр DirectShow, называемым Enhanced Video Renderer ( EVR ). [43] EVR разработан для работы с Desktop Window Manager и поддерживает DXVA 2.0 , который доступен в Windows Vista и Windows 7. [44] [ необходима цитата ] Он обеспечивает лучшую производительность и лучшее качество по данным Microsoft. [45]
8 января 2007 года компания Microsoft получила премию «Эмми» за архитектуру и компоненты потокового мультимедиа на 58-й ежегодной церемонии вручения премии «Эмми» в области технологий и инжиниринга . [46]
Командовать DirectShow для воспроизведения файла — сравнительно простая задача. Однако при программировании более сложных настроек, таких как команда DirectShow для отображения определенных сообщений Windows из видеоокна или создание пользовательских фильтров, многие разработчики жалуются на трудности. [47] [48] Она считается одной из самых сложных библиотек разработки/API Microsoft. [49] [ необходима цитата ]
Разработчики редко создают фильтры DirectShow с нуля. Вместо этого они используют базовые классы DirectShow. [ необходима цитата ] Базовые классы часто могут упростить разработку, позволяя программисту обходить определенные задачи. Однако процесс может оставаться относительно сложным; [ необходима цитата ] код, найденный в базовых классах, составляет почти половину размера всей библиотеки MFC . [ необходима цитата ] В результате, даже с базовыми классами, количество объектов COM, которые содержит DirectShow, часто подавляет разработчиков. [ необходима цитата ] [ обтекаемые слова ] В некоторых случаях API DirectShow отклоняется от традиционных правил COM, особенно в отношении параметров, используемых для методов . [ необходима цитата ] [ обтекаемые слова ] Чтобы преодолеть свои трудности с уникальными правилами COM DirectShow, разработчики часто обращаются к API более высокого уровня, который использует DirectShow, в частности, к Windows Media Player SDK , API, предоставляющему разработчику элемент управления ActiveX, который имеет меньше интерфейсов COM для работы. [ необходима цитата ] [ ласковые слова ]
Хотя DirectShow способен динамически строить график для визуализации заданного типа мультимедиа, в некоторых случаях разработчикам сложно полагаться на эту функциональность, и им приходится прибегать к ручному построению графиков фильтров, если результирующий график фильтров является переменным. [ необходима цитата ] Графики фильтров могут со временем меняться по мере установки новых фильтров на компьютер. [ необходима цитата ]
Codec hell (термин, полученный от DLL hell ) — это когда несколько фильтров DirectShow конфликтуют из-за выполнения одной и той же задачи. Большое количество компаний теперь разрабатывают кодеки в форме фильтров DirectShow, что приводит к наличию нескольких фильтров, которые могут декодировать один и тот же тип медиа. [50] [51] Эта проблема еще больше усугубляется системой заслуг DirectShow, где реализации фильтров в конечном итоге конкурируют друг с другом, регистрируя себя со все более высоким приоритетом. [51]
Тед Йоманс из Microsoft объяснил, что «DirectShow был основан на системе заслуг, идея которой заключалась в том, что, используя комбинацию заслуг фильтра и того, насколько специфичен тип/подтип носителя, можно было бы разумно выбирать правильный кодек каждый раз. Он на самом деле не был разработан для конкурирующей гонки ядерных вооружений заслуг». [51]
Инструментом, помогающим в устранении неполадок «кодек-ада», на который обычно ссылаются, является GSpot Codec Information Appliance, который может быть полезен для определения того, какой кодек используется для рендеринга видеофайлов в AVI и других контейнерах. [52] GraphEdit также может помочь понять последовательность фильтров, которые DirectShow использует для рендеринга медиафайла. Кодек-ад можно устранить, вручную построив графики фильтров, используя медиаплеер, который поддерживает игнорирование или переопределение достоинств фильтров, или используя менеджер фильтров, который изменяет достоинства фильтров в реестре Windows . [22]
DirectShow, будучи ориентированной на разработчика инфраструктурой и API, не предлагает конечному пользователю напрямую управлять кодированием контента, а также не включает пользовательский интерфейс для кодирования с использованием установленных кодеков или в различные форматы; вместо этого он полагается на разработчиков, которые разрабатывают программное обеспечение с использованием API. Напротив, другие мультимедийные инфраструктурные среды, такие как QuickTime или Video for Windows, позволяют конечным пользователям выполнять основные задачи, связанные с видео, такие как повторное кодирование с использованием другого кодека и редактирование файлов и потоков. [ необходима цитата ] Удобство, предлагаемое графическим интерфейсом конечного пользователя, очевидно, поскольку формат AVI и кодеки, используемые Video for Windows , по-прежнему остаются в использовании, например VirtualDub .