Light-industry-up.ru

Экосистема промышленности

Directshow vb6, directshow delphi 7

25-01-2024

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

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

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

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

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

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

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

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

//---------------------------------------------------------------------------
#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 (например, реализация своего фильтра любого типа) является довольно сложной задачей и требует хороших навыков.[10][11][12]

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

Codec hell

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

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

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

См. также

Примечания

  1. ↑ Core Media Technology in Windows XP Empowers You to Create Custom Audio/Video Processing Components. MSDN Magazine. Microsoft (июль 2002). Архивировано из первоисточника 13 марта 2012. Проверено 28 мая 2008.
  2. ↑ DirectShow documentation. MSDN. Microsoft. Архивировано из первоисточника 13 марта 2012. Проверено 28 мая 2008.
  3. Microsoft Announces ActiveMovie. Microsoft (5 марта 1996). Архивировано из первоисточника 13 марта 2012. Проверено 28 мая 2008.
  4. Microsoft Unveils First Unified Multimedia API Strategy. Microsoft (31 марта 1997). Архивировано из первоисточника 13 марта 2012. Проверено 28 мая 2008.
  5. Microsoft and Progressive Networks Collaborate on Streaming Media. Microsoft (21 июля 1997). Архивировано из первоисточника 13 марта 2012. Проверено 28 мая 2008.
  6. ↑ Programming Microsoft DirectShow for Digital Video and Television. — Microsoft Press, 2003. — ISBN 0-7356-1821-6
  7. DirectShow FAQ. MSDN. Microsoft. Архивировано из первоисточника 13 марта 2012. Проверено 28 мая 2008.
  8. Formats supported by default in DirectShow. MSDN. Microsoft. Архивировано из первоисточника 13 марта 2012. Проверено 30 мая 2008.
  9. Для корректной компиляции данного примера необходимо: установить DirectX SDK; указать пути поиска заголовков (*.h — файлов) и подключить библиотеку strmiids.lib к проекту.
  10. Using DirectShow with Media Center Edition (05 января 2006). Архивировано из первоисточника 13 марта 2012. Проверено 22 января 2012.
  11. The Basics to using DirectShow (13 марта 2001). Архивировано из первоисточника 13 марта 2012. Проверено 22 января 2012.
  12. LEAD Technologies: DirectShow defined. Архивировано из первоисточника 13 марта 2012. Проверено 22 января 2012.
  13. Codec Hell: Home Video 101 blog.  ??? (???). Архивировано из первоисточника 13 марта 2012. Проверено 16 июня 2008.
  14. Codec’s = New Age DLL Hell? Hell Yes — Chris Lanier’s Blog.  ??? (???). Архивировано из первоисточника 13 марта 2012. Проверено 16 июня 2008.
  15. The GSpot Codec Information Appliance. Архивировано из первоисточника 13 марта 2012. Проверено 22 января 2012.

Ссылки

  • Sample Chapter from Programming Microsoft® DirectShow® for Digital Video and Television  (англ.)
  • DirectShow по-русски
  • Radlight Ogg Theora DirectShow-фильтр (англ.)
  • Книга DirectShow и телевидение

Directshow vb6, directshow delphi 7.

Укэ, Категория:Кегумс, Категория:Родившиеся в Орландо, Центральный комитет польских евреев, Файл:Samuel Plimsoll.jpg.

© 2014–2023 light-industry-up.ru, Россия, Краснодар, ул. Листопадная 53, +7 (861) 501-67-06