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]
В качестве основы для 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, начиная с версии Windows Server 2003 SP1 SDK. [3] Однако для сборки некоторых примеров DirectShow по-прежнему требовался DirectX SDK. [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 завершить граф фильтра, соединив фильтры вместе. На следующем уровне разработчик должен построить граф фильтров с нуля, вручную добавляя и подключая каждый нужный фильтр. Наконец, в случаях, когда необходимый фильтр недоступен, разработчик должен создать собственный фильтр, прежде чем можно будет построить граф фильтра. [ нужна цитата ]
В отличие от основного C API QuickTime, где необходимо в цикле вызывать MoviesTask для загрузки медиафайла, DirectShow обрабатывает все это прозрачным образом. Он создает несколько фоновых потоков, которые плавно воспроизводят запрошенный файл или URL-адрес без особых усилий со стороны программиста. [ нужна цитата ] Также, в отличие от QuickTime, для загрузки URL-адреса вместо локального файла на диске не требуется ничего особенного — граф фильтров DirectShow абстрагирует эти детали от программиста, хотя недавние разработки в QuickTime (включая элемент управления ActiveX ) уменьшили это неравенство. [ нужна цитата ]
Службы редактирования DirectShow (DES), представленные в DirectX 8.0/ Windows XP, представляют собой API, предназначенный для задач редактирования видео и построенный на основе базовой архитектуры DirectShow. Службы редактирования DirectShow были представлены для Microsoft Windows Movie Maker . [1] Он включает в себя API-интерфейсы для служб временной шкалы и переключения, изменения размера, обрезки, видео- и аудиоэффектов, а также переходов, кеинга , автоматического преобразования частоты кадров и частоты дискретизации , а также других функций, которые используются при нелинейном редактировании видео, позволяя создавать композитного мультимедиа из ряда исходных аудио- и видеопотоков. Службы редактирования DirectShow позволяют выполнять композицию более высокого уровня во время выполнения, обращаться за поддержкой и управлять графиками, в то же время позволяя приложениям получать доступ к функциям DirectShow более низкого уровня.
Хотя исходный API написан на C++, службы редактирования DirectShow доступны на любом языке, совместимом с Microsoft .NET, включая Microsoft Visual C# и Microsoft Visual Basic , с использованием сторонней библиотеки кода под названием «Библиотека DirectShowNet». [32] В качестве альтернативы, весь API DirectShow, включая службы редактирования DirectShow, можно получить из Borland Delphi 5, 6 и 7, C++ Builder 6 и из более поздних версий с несколькими незначительными изменениями, используя стороннюю программную библиотеку под названием «DSPack». ". [33]
По состоянию на март 2012 года [34] (и, по-видимому, ещё в 2009 году [35] ) Microsoft заявила, что API службы редактирования DirectShow «не поддерживается и может быть изменен или недоступен в будущем».
Первоначально в 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 также поддерживает расширения видеопортов (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] В этой версии вместо DirectDraw используется Direct3D 9, что позволяет разработчикам преобразовывать видеоизображения с помощью пиксельных шейдеров 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 способен динамически строить график для рендеринга заданного типа мультимедиа, в некоторых случаях разработчикам сложно полагаться на эту функцию, и им приходится прибегать к построению графов фильтров вручную, если результирующий граф фильтров является переменным. [ нужна цитация ] Графики фильтров могут меняться со временем по мере установки новых фильтров на компьютер. [ нужна цитата ]
Ад кодека (термин, производный от DLL hell ) — это когда несколько фильтров DirectShow конфликтуют при выполнении одной и той же задачи. Большое количество компаний сейчас разрабатывают кодеки в виде фильтров DirectShow, в результате чего появилось несколько фильтров, которые могут декодировать один и тот же тип мультимедиа. [50] [51] Эта проблема еще больше усугубляется системой оценки DirectShow, где реализации фильтров в конечном итоге конкурируют друг с другом, регистрируя себя с все более высоким приоритетом. [51]
Тед Юманс из Microsoft объяснил, что «DirectShow был основан на системе оценок, идея заключалась в том, что, используя комбинацию достоинств фильтра и специфичности типа/подтипа мультимедиа, можно каждый раз разумно выбирать правильный кодек. Это было не так. на самом деле он не предназначен для конкурентной гонки ядерных вооружений». [51]
Инструментом, помогающим в устранении проблем «адского кодека», обычно упоминаемых, является устройство информации о кодеках GSpot, которое может быть полезно при определении того, какой кодек используется для рендеринга видеофайлов в AVI и других контейнерах. [52] GraphEdit также может помочь понять последовательность фильтров, которые DirectShow использует для рендеринга медиафайла. Ад кодеков можно решить, построив графики фильтров вручную, используя медиаплеер, поддерживающий игнорирование или переопределение достоинств фильтров, или используя менеджер фильтров, который изменяет достоинства фильтров в реестре Windows . [22]
DirectShow, будучи инфраструктурой и API, ориентированными на разработчиков, не предлагает напрямую конечному пользователю контроль над кодированием контента и не включает пользовательский интерфейс для кодирования с использованием установленных кодеков или в другие форматы; вместо этого он полагается на разработчиков для разработки программного обеспечения с использованием API. Напротив, другие мультимедийные платформы, такие как QuickTime или Video for Windows, позволяют конечным пользователям выполнять основные задачи, связанные с видео, такие как перекодирование с использованием другого кодека и редактирование файлов и потоков. [ нужна цитация ] Удобство, предлагаемое графическим интерфейсом конечного пользователя, очевидно, поскольку формат AVI и кодеки, используемые Video for Windows , все еще используются, например VirtualDub .