Знаймо

Додати знання

приховати рекламу

Цей текст може містити помилки.

DirectShow



План:


Введення

Логотип 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.


1. Історія

На початку 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]


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) встановлюються з різними сторонніми програмами.

Фільтри візуалізації ( рендеринга) - призначені для виведення даних з потоку в стандартне фізичне пристрій виведення, наприклад, на монітор, на звукову карту або в файл. За аналогією з фільтрами захоплення фільтрів візуалізації також може бути декілька, наприклад, для одночасного відображення відео на екрані і запису цього ж відео в файл.


3. Структурна схема

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

4. Приклад програми на мові C + +

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

 / / ------------------------------------------------ ---------------------------  # Include   # Include   # Pragma comment (lib, "strmiids.lib")  / / ------------------------------------------------ ---------------------------  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  ;  }  / / ------------------------------------------------ --------------------------- 

5. Критика

5.1. Складність

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

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


5.2. Codec hell

Codec hell (термін, що виник за аналогією DLL hell) - це конфлікт, що виникає між різними фільтрами, які намагаються виконати одну і ту ж задачу. Справа в тому, що, зараз, велика кількість компаній виробляють кодеки у формі DirectShow фільтрів, які частенько виконують схожі завдання з однаковим типом медіа. [13] [14]

Інструменти, які можуть допомогти в боротьбі з Codec Hell:

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

Примітки

  1. 1 2 Core Media Technology in Windows XP Empowers You to Create Custom Audio / Video Processing Components - msdn.microsoft.com/ru-ru/magazine/cc301631 (en-us). aspx. MSDN Magazine. Microsoft (липень 2002). Читальний - www.webcitation.org/667acEDxj з першоджерела 13 березня 2012.
  2. 1 2 3 DirectShow documentation - msdn.microsoft.com/ru-ru/library/ms783323 (en-us, VS.85). aspx. MSDN. Microsoft. Читальний - www.webcitation.org/667ad2Fcy з першоджерела 13 березня 2012.
  3. Microsoft Announces ActiveMovie - www.microsoft.com/presspass/press/1996/mar96/actmovpr.mspx. Microsoft (5 березня 1996). Читальний - www.webcitation.org/667adfECm з першоджерела 13 березня 2012.
  4. Microsoft Unveils First Unified Multimedia API Strategy - www.microsoft.com/presspass/press/1997/mar97/mmapipr.mspx. Microsoft (31 березня 1997). Читальний - www.webcitation.org/667aeZY6O з першоджерела 13 березня 2012.
  5. Microsoft and Progressive Networks Collaborate on Streaming Media - www.microsoft.com/presspass/press/1997/Jul97/pronetpr3_95.mspx. Microsoft (21 липня 1997). Читальний - www.webcitation.org/667afOx26 з першоджерела 13 березня 2012.
  6. 1 2 Mark D. Pesce. Sample Chapter / / Programming Microsoft DirectShow for Digital Video and Television - www.microsoft.com/mspress/books/sampchap/6381.asp # SampleChapter. - Microsoft Press, 2003. - ISBN 0-7356-1821-6
  7. DirectShow FAQ - msdn.microsoft.com/ru-ru/library/ms783346 (en-us, VS.85). aspx. MSDN. Microsoft. Читальний - www.webcitation.org/667agE8hm з першоджерела 13 березня 2012.
  8. Formats supported by default in DirectShow - msdn.microsoft.com/ru-ru/library/ms787745 (en-us, VS.85). aspx. MSDN. Microsoft. Читальний - www.webcitation.org/667agoiKS з першоджерела 13 березня 2012.
  9. Для коректної компіляції даного прикладу необхідно: встановити DirectX SDK; вказати шляхи пошуку заголовків (*. H - файлів) і підключити бібліотеку strmiids.lib до проекту.
  10. Using DirectShow with Media Center Edition - www.mperfect.net/mceDirectShow/ (05 січня 2006). Читальний - www.webcitation.org/667ahPM5q з першоджерела 13 березня 2012.
  11. The Basics to using DirectShow - www.gamedev.net/reference/articles/article1345.asp (13 березня 2001). Читальний - www.webcitation.org/667aiLjNv з першоджерела 13 березня 2012.
  12. LEAD Technologies: DirectShow defined - www.leadtools.com / SDK / MULTIMEDIA / Multimedia-DirectShow.htm. Читальний - www.webcitation.org/667aj5xUQ з першоджерела 13 березня 2012.
  13. Codec Hell: Home Video 101 blog - www.homevideo101.com/codec-hell/. ??? (?). Читальний - www.webcitation.org/667ajYURk з першоджерела 13 березня 2012.
  14. Codec's = New Age DLL Hell? Hell Yes - Chris Lanier's Blog - msmvps.com/blogs/chrisl/archive/2005/01/27/34039.aspx. ??? (?). Читальний - www.webcitation.org/667ak5UIA з першоджерела 13 березня 2012.
  15. The GSpot Codec Information Appliance - www.headbands.com/gspot/. Читальний - www.webcitation.org/667akkIEd з першоджерела 13 березня 2012.

Цей текст може містити помилки.

Схожі роботи | скачати
© Усі права захищені
написати до нас