DirectShow

Материал из Seo Wiki - Поисковая Оптимизация и Программирование

Перейти к: навигация, поиск
Файл:Dxmlogomsmall.gif
Логотип DirectX Media SDK – первый раз DirectShow распространялся под этим именем.


DirectShow (иногда сокращается до DS или DShow), кодовое название Quartz, мультимедийный фреймворк и интерфейс программирования приложений (API) произведённый корпорацией Microsoft для разработчиков программного обеспечения позволяющий Windows-приложениям управлять широким спектром устройств аудио/видео ввода/вывода, включающим DV-камеры, веб-камеры, DVD-устройства, карты ТВ-тюнеров и др. Поддерживает также различные форматы файлов, от WAV и AVI до Windows Media. Является заменой более ранней технологии Microsoft - Video for Windows[1]. Основан на Microsoft Windows Component Object Model (COM), DirectShow предоставляет общий интерфейс работы с мультимедиа поддерживаемый большинством языков программирования. Кроме того, DirectShow расширяем и позволяет поддерживать устройства, форматы и компоненты обработки сторонних производителей. Средства разработчика и документация ранее распространялись как часть DirectX SDK, в настоящее время они распространяются совместно с Platform SDK, которая в свою очередь входит в состав Windows SDK[2]. В будущем Microsoft планирует замену DirectShow на Media Foundation.

Содержание

История

На рубеже 1990-х годов после выхода релиза Windows 3.1 на рынке США появился ряд цифровых видео устройств (известных сейчас как веб-камеры). Обычно эти устройства подключались через параллельный порт (LPT порт принтера). Со временем, эти устройства становились популярнее, и корпорация Microsoft решила разработать технологию по работе с мультимедиа данными для разработчиков. Эта технология получила название Video for Windows (VFW). Но с самого своего рождения у VFW был огромный недостаток - сложность работы с MPEG видео[1].

Перед выходом Windows 95 корпорация Microsoft стартовала новый проект ActiveMovie[3] (кодовое название Quartz) для поддержки MPEG, 32-битной архитектуры и потоковой передачи видео/аудио данных. Новый проект характерен тем, что в нём использовались новые разработки корпорации Microsoft, а именно Component Object Model (COM). Только в Quartz принято объекты называть фильтрами, которые как блоки конструктора LEGO объединяются в граф-фильтр. Благодаря архитектуре COM, отдельный фильтр является самодостаточным объектом, который может быть создан сторонним разработчиком для своих нужд (например: для поддержания функциональности своего устройства).

В 1997 году корпорация Microsoft интегрирует ActiveMovie в DirectX и меняет название на DirectShow[4][5]. В 1998 году в стандартную поставку DirectShow включается поддержка DVD. В 2000 году добавляются функции редактирования потоков данных и интеграция DirectShow в DirectX окончательно завершается. Теперь разработчики могут захваченное видео проецировать в своих трёхмерных сценах. В релизе DirectX 9 в DirectShow добавлена возможность объединения видео потоков в один для микширования видео[6].

В октябре 2004, DirectShow удаляется из официальной поставки DirectX и переносится к дополнениям DirectX. В апреле 2005, DirectShow полностью удаляется из официальных поставок DirectX и перемещается в Windows Server 2003 SP1 версию Microsoft Platform SDK[2]. Тем не менее для компиляции некоторых примеров из документации всё ещё требуется DirectX SDK[7]. А вот уже с выходом Windows Vista и документация начинает поставляться совместно с Windows SDK [2].

Возможности

Хорошим примером возможностей DirectShow — может служить приложение Windows Movie Maker. Большинство сторонних приложений для редактирования мультимедиа данных под операционную систему Windows так же использует DirectShow[6]. Так как фильтры DirectShow разделены на три типа, соответственно и возможности DirectShow можно классифицировать соответствующим образом.

Фильтры захвата — предназначены для ввода мультимедиа данных в поток программы с различных физических устройств. В роли устройства могут быть как различного рода видео устройства (портативные видео камеры, веб-камеры, TV-тюнеры…), так и аудио устройства (микрофон, модемная линия…), а так же, данные могут быть получены и из файла (AVI, MPEG, MP3…). DirectShow позволяет одновременно использовать несколько фильтров захвата, например: для одновременного захвата видео с веб-камеры и звука с микрофона. Количество одновременно используемых фильтров захвата ограничено лишь мощностью используемого компьютера.

Файл:GraphEdit avi.jpg
Пример графа-фильтров для воспроизведения AVI файла.

Фильтры преобразования — предназначены для обработки поступающих данных из потока программы и последующей отправки преобразованных данных назад в поток к следующему типу фильтров. Этот тип фильтров может производить анализ данных, может полностью манипулировать аудио/видео данными для создания сложных визуальных эффектов, или, просто объединять (или разъединять) аудио и видео каналы. В стандартной поставке вместе с операционной системой Windows корпорация Microsoft предоставляет небольшое количество готовых фильтров: кодеки (MPEG-1, MP3, WMA, WMV, MIDI), контейнеры (AVI, ASF, WAV), несколько сплитеров (или демультиплексоров) и мультиплексоров[8]. Другие же популярные фильтры: кодеки (MPEG-4, AAC, H.264, Vorbis) и контейнеры (Ogg, .mov, MP4) устанавливаются с различными сторонними программами.

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

Структурная схема

Файл:Dsstruct.jpg
Структурная схема DirectShow

Пример программы на языке C++

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

Примечание: для корректной компиляции данного примера необходимо: установить DirectX SDK; указать пути поиска заголовков (*.h - файлов) и подключить библиотеку "strmiids.lib" к проекту.

//---------------------------------------------------------------------------
#include <stdio.h>
#include <dshow.h>
//---------------------------------------------------------------------------
char * pcFileName = "test.avi";
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    IGraphBuilder * pGraph(NULL);    //Интерфейс менеджера графа-фильтров
    IMediaControl * pControl(NULL);  //Интерфейс управления
    IMediaEvent   * pEvent(NULL);    //Интерфейс сообщений
 
    //Инициализируем библиотеку COM
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    if(SUCCEEDED(hr))
    {
        //Создание менеджера графа-фильтров
        hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
                                IID_IGraphBuilder, (void **)&pGraph);
        if(SUCCEEDED(hr))
        {
            //Получение интерфейса управления
            hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
            if(SUCCEEDED(hr))
            {
                //Получение интерфейса сообщений
                hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
                if(SUCCEEDED(hr))
                {
                    //Загрузка файла (Внимание! Unicode)
                    WCHAR wFileName[MAX_PATH];
                    MultiByteToWideChar(CP_ACP, 0, pcFileName, -1, wFileName, MAX_PATH);
                    hr = pGraph->RenderFile((LPCWSTR)wFileName, NULL);
 
                    //Для не Unicode
                    //hr = pGraph->RenderFile((LPCWSTR)pcFileName, NULL);
 
                    if(SUCCEEDED(hr))
                    {
                        //Запуск воспроизведения
                        hr = pControl->Run();
                        if(SUCCEEDED(hr))
                        {
                            //В реальном приложении INFINITE лучше не использовать
                            long evCode;
                            pEvent->WaitForCompletion(INFINITE, &evCode);
                        }
 
                        //Остановка графа-фильтров
                        hr = pControl->Stop();
                    }
                }
                else
                {
                    printf("Ошибка: не удаётся получить интерфейс сообщений медиа!");
                }
            }
            else
            {
                printf("Ошибка: не удаётся получить интерфейс управления медиа!");
            }
        }
        else
        {
            printf("Ошибка: не удаётся создать менеджер графа-фильтров!");
        }
 
        //Освобождаем ресурсы
        if(pControl) pControl->Release();
        if(pEvent)   pEvent->Release();
        if(pGraph)   pGraph->Release();
 
        CoUninitialize();
    }
    else
    {
        printf("Ошибка: не удаётся инициализировать библиотеку COM!");
    }
 
    return hr;
}
//---------------------------------------------------------------------------

Критика

Сложность

Воспроизведение обычного видеофайла довольно простая задача для реализации при помощи DirectShow. Написание же программы, с использованием всех механизмов DirectShow (например, реализация своего фильтра любого типа) является довольно сложной задачей и требует хороших навыков[9][10][11].

Разработчики редко создают DirectShow фильтры "с нуля", чаще, они используют базовые классы. Эти классы обычно позволяют упростить разработку, позволяя программисту обойти некоторые задачи. Однако, процесс может остаться довольно сложным, потому как количество кода в базовых классах примерно соответствует половине объёма библиотеки MFC. А количество объектов, основанных на базовых классах, ошеломляет многих разработчиков. Причём, в некоторых случаях, DirectShow API отличается от обычных правил COM объектов, особенно это заметно в параметрах методов. Для обхода этих сложностей разработчики часто используют более высокий уровень: Windows Media Player SDK, который основан на ActiveX объекте и использует обычные правила COM.

Codec hell

Codec hell (термин возникший от DLL hell) - это конфликт, возникающий между различными фильтрами, которые пытаются выполнить одну и ту же задачу. Дело в том, что, сейчас, большое количество компаний производят кодеки в форме DirectShow фильтров, которые частенько выполняют схожие задачи с одинаковым типом медиа[12][13].

Инструменты, которые могут помочь в борьбе с Codec Hell:

  • GSpot Codec Inforamtion Appliance[14], GSpot помогает определить, какой кодек подходит для визуализации AVI файла или другого контейнера;
  • GraphEdit, позволяет определить набор фильтров, которые DirectShow использует для воспроизведения медиа файлов;
  • "вручную", то есть граф-фильтров строится заранее проверенными фильтрами.

Смотрите также

Заметки

  1. 1,0 1,1 MSDN Magazine Core Media Technology in Windows XP Empowers You to Create Custom Audio/Video Processing Components. Microsoft PressPass (July, 2002). Проверено 28 мая 2008.
  2. 2,0 2,1 2,2 MSDN DirectShow documentation on MSDN. Microsoft MSDN. Проверено 28 мая 2008.
  3. Microsoft Microsoft Announces ActiveMovie. Microsoft PressPass (March 5, 1996). Проверено 28 мая 2008.
  4. Microsoft Microsoft Unveils First Unified Multimedia API Strategy. Microsoft PressPass (March 31, 1997). Проверено 28 мая 2008.
  5. Microsoft Microsoft and Progressive Networks Collaborate on Streaming Media. Microsoft PressPass (July 21, 1997). Проверено 28 мая 2008.
  6. 6,0 6,1 Programming Microsoft DirectShow for Digital Video and Television. — Microsoft Press, 2003. — ISBN ISBN 0-7356-1821-6 (Sample Chapter)
  7. MSDN DirectShow FAQ. Microsoft MSDN. Проверено 28 мая 2008.
  8. Formats supported by default in DirectShow. Проверено 30 мая 2008.
  9. Using DirectShow with Media Center Edition. Проверено 16 июня 2008.
  10. The Basics to using DirectShow. Проверено 16 июня 2008.
  11. LEAD Technologies: DirectShow defined. Проверено 16 июня 2008.
  12. Codec Hell: Home Video 101 blog. Проверено 16 июня 2008.
  13. Codec’s = New Age DLL Hell? Hell Yes — Chris Lanier’s Blog. Проверено 16 июня 2008.
  14. The GSpot Codec Information Appliance. Проверено 16 июня 2008.

Ссылки

Внешние ссылки

  • MSDN - 'Официальная DirectShow документация' (англ)
  • [1] - DirectShow по-русски
  • [2] - пример программирования видео, компоненты и библиотеки
  • [3] - использование DirectX совместно с Borland C++ Builder (англ)
  • [4] - Radlight Ogg Theora DirectShow фильтр (англ)
cs:DirectShow

en:DirectShow it:DirectShow ja:DirectShow ko:다이렉트쇼 lt:DirectShow pl:DirectShow pt:DirectShow sv:DirectShow zh:DirectShow

Источник — «http://www.sbup.com/wiki/DirectShow»
Личные инструменты

Served in 0.450 secs.