| |
Обзор DirectShow
Перевод выполнен Алейкиным Е.В
http://en.wikipedia.org/wiki/DirectShow
DirectShow
DirectShow (иногда сокращаемый как DS или DShow), кодовое название Quartz, является мультимедийным фреймворком и набором API, произведенным Microsoft для разработчиков программного обеспечения. DirectShow позволяет выполнять различные операции с видео-файлами и потоками. Это замена для более ранней технологии – Video for Windows . Основанный на Microsoft Windows Component Object Model (COM), DirectShow предоставляет универсальный интерфейс для многих языков программирования, и является расширяемым. Технология основывается на использовании структуры фильтров, которая позволяет осуществлять вывод или запись видео в зависимости от потребности разработчика. Инструменты DirectShow и документация первоначально распространялись как часть DirectX SDK, однако, они в настоящее время являются частью Windows SDK (ранее Platform SDK).
История
Прямой предшественник DirectShow, ActiveMovie (под кодовым названием Quartz), был первоначально направлен на поддержку в Windows воспроизведения файлов MPEG-1. Он также был предназначен как будущая замена таких мультимедиа фреймворков как Video for Windows, который никогда не разрабатывался для поддержки кодеков, которые при сжатии располагают кадры в разной последовательности, и интерфейс Media Control, который никогда полностью не был перенесен на 32-битную платформу и не использовал COM.
Команда Quartz началась с существующего проекта под названием «Часовой механизм». «Часовой механизм» был модульными мультимедиа фреймворком, в котором полуавтономные компоненты работали совместно для обработки цифровых мультимедиа потоков, и ранее использовался в нескольких проектах, включая Microsoft Interactive Television (MITV) и еще один проект под названием Tiger.
Архитектура
DirectShow разбивает сложную мультимедийную задачу (например видео воспроизведение) на последовательность фундаментальных шагов обработки, известных как фильтры. Каждый фильтр, представляющий одну стадию в обработке данных, имеет вход и выход, таким образом, фильтры могут соединяться между собой. Базовая природа этого механизма связи позволяет фильтрам быть связанными различными способами и осуществлять различные сложные функции. Чтобы осуществить некоторую сложную задачу, разработчик должен сначала построить граф фильтра, создавая необходимые фильтров, а затем соединить их вместе.
GraphEdit - GUI, который используется для визуального построения и тестирования графов. Во время процесса воспроизведения, граф осуществляет поиск в реестре Windows на предмет зарегистрированных фильтров и затем строит граф фильтров, основываясь на начальных условиях. После этого происходит соединение фильтров между собой и, в зависимости от запроса разработчика, запускает (воспроизводит, приостанавливает) созданный граф. Графы фильтров в DirectShow широко используются при воспроизведении (в котором фильтры осуществляют функции, такие как парсинг файла, видео и аудио демультиплексирование, декомпрессия, и воспроизведение), а также для видео и аудио захвата и редактирования. DirectShow также может управлять такими интерактивными задачами как DVD навигация.
В вышеупомянутом примере, слева направо, граф содержит исходный фильтр, читающий MP3-файл, разделитель потока и фильтр декодера, чтобы расшифровать аудио, а также фильтр воспроизводящий звуковые образцы. У каждого фильтра есть один или более входов и выходов которые используются для соединения с другими фильтрами. В зависимости от фильтра данные либо запрашиваются у выхода предшествующего фильтра либо передаются самим выходом на вход следующего фильтра, т.о. данные передаются по фильтрам.
Большинство фильтров построены, используя совокупность C ++ классов, предоставленные в DirectShow SDK, называемые базовыми классами DirectShow. Они реализую большую часть работы связанной с созданием, регистрацией и логикой связи для фильтра. Для графа фильтров, чтобы использовать фильтры автоматически, необходимо чтобы они были зарегистрированы в отдельном месте реестра для DirectShow, а так же зарегистрированы в COM. Этой регистрацией могут управлять базовые классы DirectShow. Однако, если приложение добавляет фильтры вручную, они не должны быть зарегистрированы вообще.
К сожалению, трудно изменить граф, который уже запущен. Обычно легче остановить граф и создать новый граф с нуля. Начиная с DirectShow 8.0, для изменения графа после его запуска, введены возможности динамического построения графа, динамического переподсоединения , и цепочки фильтров. Однако, многие поставщики фильтров игнорируют эту особенность, делая проблематичным модификацию графа после его запуска.
Особенности
По умолчанию, DirectShow включает ограниченное число фильтров для декодирования некоторых распространенных форматов файлов, таких как MPEG-1, MP3, Windows Media Audio, Windows Media Video, MIDI, медиа контейнеры AVI, ASF, WAV, несколько разделителей потока/демультиплексоры, мультиплексоры, Source/Sink фильтры и некоторые фильтры для статических изображений. Так как ассоциированные запатентованные технологии лицензируются Windows, оплата за лицензию не требуется (например Fraunhofer для MP3). Исключения составляют: кодеры-декодеры для поддержки популярных и современных форматов, таким как MPEG-4 Advanced Simple Profile, AAC, H.264, Vorbis и контейнеры Ogg, MOV, MP4. Поддержки этих дополнительных кодеров-декодеров, влечет плату за лицензии разработчику технологии кодера или держателю патента.
Однако, стандартный набор DirectShow может быть легко расширен посредством множества коммерческих и открытых исходных фильтров. Такие фильтры позволяют DirectShow поддерживать фактически любой контейнерный формат и любой звуковой или видео кодер-декодер. Например, были разработаны фильтры для Ogg Vorbis, Musepack и AC3. Наконец, есть фильтры "мосты", которые одновременно поддерживают как несколько форматов, так и функции мультиплексирования потока, предоставляя функциональность нижележащего мультимедиа API, такого как VLC.
Объем работы, требуемый для построения графа фильтров, зависит от нескольких факторов. В самом простом случае DirectShow может создать граф фильтров автоматически из источника, такого как файл или URL. Если это не возможно, разработчик может вручную создать граф фильтров из исходного файла, возможно с дополнением собственного фильтра, и затем позволить DirectShow закончить построение, соединяя фильтры вместе. На следующем уровне разработчик должен построить граф фильтра с нуля, вручную добавляя и соединяя каждый нужный фильтр. Наконец, в случаях, когда необходимый фильтр недоступен, разработчик должен создать собственный фильтр.
В отличие от основного C API QuickTime, где необходимо вызывать циклически MoviesTask, чтобы загрузить медиа файл, DirectShow обрабатывает все это прозрачным способом. Создается несколько второстепенных потоков, которые непрерывно воспроизводят требуемый файл или URL без больших усилий требуемых от программиста. Также в отличие от QuickTime, не требуется ничего специального для загрузки по URL вместо локального файла на диске - граф фильтров DirectShow делает это прозрачным для программиста, хотя недавние разработки в QuickTime (включая ActiveX) уменьшили это.
Сложность
Используя DirectShow чтобы воспроизвести файл, является относительно простой задачей. Однако, много разработчиков, программируя более передовые функциональности, такие как обработка сообщений для видео окон или создание собственных фильтров, жалуются на трудности. DirectShow часто расценивается как одна из самых сложных библиотек от Microsoft.
Разработчики редко создают фильтры DirectShow с нуля, скорее они используют базовые классы DirectShow. Базовые классы упрощают разработку, позволяя программисту не касаться некоторых задач. Однако, процесс все же, может остаться относительно сложным; код базовых классов по объему равняется почти половине всей библиотеки MFC. В результате даже с базовыми классами, число COM объектов, которые DirectShow содержит, потрясает многих разработчиков. В некоторых случаях, DirectShow API отклоняется от традиционных правил COM, особенно относительно параметров, используемых для методов. Чтобы преодолеть трудности связанные с уникальными правилами DirectShow COM, разработчики часто предпочитают высокоуровневому API, который использует DirectShow – Media Player SDK. Этот API предоставляет разработчику ActiveX элемент, у которого намного меньше интерфейсов COM, с которыми необходимо работать.
Хотя DirectShow способен динамически строить граф, для воспроизведения необходимого типа файла, для разработчиков может быть трудным использовать эти функциональные возможности. Если граф фильтра будет изменяться после запуска, они, скорее всего, предпочтут ручное построение графа. Т.е. граф фильтров может быть динамически изменен после установки на компьютер новых фильтров.
| | |