Вопросы и ответы о DirectShow

В этой статье содержатся ответы на многие часто задаваемые вопросы о Microsoft DirectShow.

Какие операционные системы поддерживает DirectShow?

DirectShow доступен во всех поддерживаемых версиях Windows.

Сколько знаний о COM требуется для программирования с помощью DirectShow?

Для разработки приложений необходимо понимать основы работы с COM-объектами: как создавать их экземпляры, получать доступ к интерфейсам, которые они предоставляют, и управлять количеством ссылок в этих интерфейсах. Для разработки фильтров требуются дополнительные знания о COM.

Какие форматы поддерживает DirectShow?

Существует ли список совместимости оборудования DirectShow (HCL)?

Нет. DirectShow использует аппаратные возможности Microsoft DirectDraw и Microsoft DirectSound, если они доступны. Если нет специального оборудования, DirectShow использует GDI для рисования видео и мультимедийные API waveOut * для воспроизведения звука.

Какие языки можно использовать для написания приложения DirectShow?

DirectShow предназначен в основном для разработки на C++. Небольшой набор API DirectShow предоставляется через Visual Basic 6.0; однако эта функция является устаревшей.

Будет ли DirectShow когда-либо доступен через управляемый код?

Корпорация Майкрософт пока не планирует реализовывать управляемый API DirectShow.

Какой компилятор нужен для разработки DirectShow?

Любой компилятор, способный создавать объекты COM, должен работать после правильной настройки среды компилятора.

Как DirectShow относится к Microsoft DirectX?

На внутреннем сервере DirectShow использует DirectSound и DirectDraw, когда оборудование поддерживает их. Фильтры отрисовщика видео и микшера наложения используют поверхности DirectDraw 3 и DirectDraw 5. Отрисовщик 7 (только для Windows XP) использует поверхности DirectDraw 7. Отрисовщик 9 и расширенный отрисовщик видео используют последние api Microsoft Direct3D. Вам не нужно использовать другие API DirectX для написания приложения DirectShow, хотя их можно объединить.

Как DirectShow относится к Microsoft ActiveMovie?

ActiveMovie — это исходное имя DirectShow. Термин ActiveMovie больше не используется.

Доступен ли исходный код для служебной программы GraphEdit? Можно ли распространить GraphEdit?

Нет, источник недоступен, и Graphedt.exe не распространяется.

Заменяют ли фильтры DirectShow в МТО?

Объекты мультимедиа Microsoft DirectX (DMOS) можно использовать в приложении DirectShow. Для кодировщиков, декодеров и эффектов рекомендуется написать DMO вместо фильтра DirectShow. (Примечание. Если вы хотите использовать ускорение видео DirectX в декодере, необходимо реализовать его в качестве фильтра.) Для других целей фильтр DirectShow может быть более подходящим. Дополнительные сведения о МТО см. в разделе Объекты мультимедиа DirectX.

Я играю файл формата AVI с Медиаплеер Windows. Я слышу звук, но там, кажется, не будет никакого видео вместо, я просто вижу черный. В чем проблема?

Вероятно, файл был закодирован с помощью кодека, который отсутствует в вашей системе. Хотя формат файлов AVI является общим, файлы AVI можно создавать с различными форматами сжатия (кодеками). При попытке воспроизвести файл AVI, использующий неподдерживаемый кодек, вы можете услышать звуковой компонент, но видео будет отображаться в виде черного экрана или содержимое экрана останется без изменений.

Примечание

Медиаплеер Windows часто пытается скачать и установить кодек, если он отсутствует в системе.

 

Разделы справки создать приложение? Какие библиотеки и файлы заголовков мне нужны?

GraphEdit отображает множество фильтров, которые не задокументированы. Что такое эти фильтры?

GraphEdit перечисляет все фильтры, зарегистрированные в системе, в категории фильтров. Это могут быть фильтры, установленные сторонними приложениями или другими технологиями Майкрософт, такими как Windows Media или NetMeeting. Кроме того, некоторые фильтры DirectShow действуют как оболочки для кодеков или аппаратных устройств, при этом каждый кодек или устройство отображаются как отдельный фильтр. Видеокодек Microsoft H.263 используется NetMeeting и больше не поддерживается в DirectShow. Дополнительные сведения см. в разделе Перечисление устройств и фильтров.

У меня возникли проблемы с созданием пользовательского графа программным способом.

Сначала попробуйте построить граф фильтра с помощью GraphEdit. Это средство позволяет быстро имитировать множество возможностей. GraphEdit всегда отлично подходит для тестирования графа, прежде чем пытаться создать его с помощью исходного кода.

Дополнительные сведения о создании графов см. в следующих статьях:

Как определить, установлен ли DirectShow на определенном компьютере?

Вызовите CoCreateInstance , чтобы создать экземпляр диспетчера фильтров Графа. Если этот вызов выполнен успешно, на компьютере устанавливается DirectShow. В следующем коде показано, как это сделать.

IGraphBuilder *pGraph;

HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
    NULL, CLSCTX_INPROC_SERVER,
    IID_IGraphBuilder, (void **) &pGraph);

Разделы справки изменить параметры фильтра без отображения страницы свойств?

Большинство фильтров предоставляют один или несколько интерфейсов для настройки свойств фильтра. Обратитесь к странице справки по соответствующему фильтру. (См. раздел Фильтры DirectShow.)

Можно ли протестировать фильтр с помощью GraphEdit?

При разработке фильтра GraphEdit может помочь визуализировать соединения между фильтрами. Он также может обеспечить быструю проверку функциональности фильтра. Однако она не предназначена для надежной тестовой платформы.

В каком кольце привилегий выполняются фильтры?

Фильтры выполняются на круге 3, хотя некоторые фильтры управляют устройствами потоковой передачи, которые выполняются на круге 0. Дополнительные сведения см. в разделе Как аппаратные устройства участвуют в графе фильтров.

Нужно ли использовать отладчик ядра?

Это зависит от конкретного проекта. Установка библиотек среды выполнения отладки DirectX означает, что вы устанавливаете отладочные драйверы и другие компоненты режима ядра, и если приложение вызывает утверждение отладки в одном из этих компонентов, компьютер будет автоматически перезагружен, если к процессу не подключен отладчик ядра.

При запуске приложения в отладчике происходит сбой.

Некоторые декодеры не работают, пока приложение подключено к отладчику. Попробуйте запустить приложение за пределами отладчика.

Как работает макрос DEFINE\_GUID?

Макрос DEFINE_GUID решает проблему объявления extern ссылок на значения GUID в исходном коде. Например, предположим, что проект содержит три исходных файла: Src1.cpp, Src2.cpp и Src3.cpp, а все три файла используют определенное вами значение GUID. Значение GUID должно быть определено в проекте ровно один раз, а другие исходные файлы должны объявлять extern ссылки на него. С помощью макроса DEFINE_GUID можно использовать один и тот же файл заголовка для обеих целей. В файле заголовка объявите GUID следующим образом:

DEFINE_GUID(CLSID_MyObject, 
0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);

(Если этот пример содержит нули, поместите фактические значения GUID.) С помощью служебной программы Guidgen.exe можно создать новый GUID и вставить его в файл заголовка в формате DEFINE_GUID . Включите этот файл заголовка в каждый исходный файл, который ссылается на GUID. В одном из исходных файлов добавьте файл заголовка Initguid.h перед файлом заголовка. Пример:

// Src1.cpp
#include <initguid.h>
#include "MyGuids.h"

// Src2.cpp
#include "MyGuids.h"

// Src3.cpp
#include "MyGuids.h"

Если файл заголовка Initguid.h не включен, макрос DEFINE_GUID создает extern ссылку на значение GUID. При включении файла заголовка Initguid.h он переопределяет макрос DEFINE_GUID , чтобы DEFINE_GUID создало определяющее объявление GUID.

Если не включить Initguid.h ни в один из исходных файлов, вы получите сообщение об ошибке ссылки "неразрешенный внешний символ". Если включить Initguid.h дважды для одного и того же GUID, вы получите ошибку компиляции "переопределение; многократная инициализация". Чтобы устранить эти ошибки, убедитесь, что initguid.h включается ровно один раз. Кроме того, не включайте Initguid.h в файл предкомпилированного заголовка, так как фактически предкомпилированные заголовки включаются в каждый исходный файл.

Введение в DirectShow