See also ebooksgratis.com: no banners, no cookies, totally FREE.

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
DirectShow — Википедия

DirectShow

Материал из Википедии — свободной энциклопедии

Логотип DirectX Media SDK – первый раз DirectShow распространялся под этим именем.
Логотип DirectX Media SDK – первый раз DirectShow распространялся под этим именем.


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

Содержание

[править] История

На рубеже 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 позволяет одновременно использовать несколько фильтров захвата, например: для одновременного захвата видео с веб-камеры и звука с микрофона. Количество одновременно используемых фильтров захвата ограничено лишь мощностью используемого компьютера.

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

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

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

[править] Пример программы на языке 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 2 MSDN Magazine Core Media Technology in Windows XP Empowers You to Create Custom Audio/Video Processing Components Microsoft PressPass Проверено 2008-05-28 г.
  2. 1 2 3 MSDN DirectShow documentation on MSDN Microsoft MSDN Проверено 2008-05-28 г.
  3. Microsoft Microsoft Announces ActiveMovie Microsoft PressPass Проверено 2008-05-28 г.
  4. Microsoft Microsoft Unveils First Unified Multimedia API Strategy Microsoft PressPass Проверено 2008-05-28 г.
  5. Microsoft Microsoft and Progressive Networks Collaborate on Streaming Media Microsoft PressPass Проверено 2008-05-28 г.
  6. 1 2 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 Проверено 2008-05-28 г.
  8. Formats supported by default in DirectShow Проверено 2008-05-30 г.
  9. Using DirectShow with Media Center Edition Проверено 2008-06-16 г.
  10. The Basics to using DirectShow Проверено 2008-06-16 г.
  11. LEAD Technologies: DirectShow defined Проверено 2008-06-16 г.
  12. Codec Hell: Home Video 101 blog Проверено 2008-06-16 г.
  13. Codec’s = New Age DLL Hell? Hell Yes — Chris Lanier’s Blog Проверено 2008-06-16 г.
  14. The GSpot Codec Information Appliance Проверено 2008-06-16 г.

[править] Ссылки

[править] Внешние ссылки

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


aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -