DirectShow является набором интерфейсов и объектов, которые работают с видео и аудио медиа. Я говорю о записи и воспроизведении медиа из любого источника, включая живое видео, потоковое содержимое веб, DVD и предварительно записанные файлы. И как будто этого было недостаточно, DirectShow даже позволяет вам создавать собственные декодеры и кодеры медиа, делающие ее единственной системой, которую выбирают.
Для того чтобы добавить DirectShow в проект, необходимо включить заголовочный файл dshow.h в исходный код.
#include "dshow.h"
Также убедитесь, что добавили файл strmiids.lib к списку файлов, связываемых в проекте. Он расположен в той же директории, что и остальные библиотеки DirectX (обычно \dxsdk\lib). После того как вы подключили и привязали соответствующие файлы, вы можете создать экземпляры следующих четырех интерфейсов DirectShow для использования в вашем коде:
IGraphBuilder *pGraph = NULL; IMediaControl *pControl = NULL; IMediaEvent *pEvent = NULL; IMediaPosition *pPosition = NULL;
Первый интерфейс IGraphBuilder, является основным. Он ответственен за загрузку и декодирование медиа файлов. Второй интерфейс, ImediaControl, управляет воспроизведением аудио файлов. Третий интерфейс, ImediaEvent, получает события, такие как завершение воспроизведения. Последний интерфейс, ImediaPosition, устанавливает и получает положение, в которое происходит воспроизведение. (Например, вы можете проиграть пять секунд аудио файла или можете начать воспроизведение с 20 секунд от начала звука.)
Замечание. Т. к. используется система COAI, необходимо вызвать функцию CoInitialize внутри кода инициализации. После завершения программы вы должны вызвать CoUninitialize, чтобы деинициализировать систему COAI.
Для создания объекта IgraphBuilder (из которого получаются три остальных интерфейса) используйте функцию CoCreatelnstance, как я сделал тут:
// Инициализировать систему COM CoInitialize(NULL);
// Создать объект IGraphBuilder CoCreateInstance(CLSID_FilterGraph,NULL,\
CLSCTX_INPROC_SERVER,IID_IGraphBuilder,\
(void**)&pGraph);
После создания объекта IGraphBuilder вы можете вызвать IGraphBuilding::Render-File, чтобы сразу начать использовать его для загрузки аудио файла. (Это называется рендеринг.) По мере того как файл рендерится, DirectShow загружает все необходимые кодеки для декодирования данных.
Функция RenderFile принимает в качестве параметра имя проигрываемого медиа файла в виде широкосимвольной строки, которую можно создать с помощью макроса L. Например, для загрузки файла MeTalking.mp3 необходимо использовать следующий код. (Заметьте, что второй параметр RenderFile всегда устанавливается в NULL.)
pGraph->RenderFile(L"MeTalking.mp3", NULL) ;
После того как вы загрузили медиа файл, вы можете получить оставшиеся три интерфейса из объекта IGraphBuilder, как я сделал здесь:
pGraph->QueryInterface(IID_IMediaControl, (void**)&pControl); pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent); pGraph->QueryInterface(IID_IMediaPosition,(void**)&pPosition) ;
Уже почти все! Начать проигрывать звук можно простым вызовом IMediaCon-trol::Run.
pControl->Run();
Вот и все. Если все прошло, как было запланировано, вы должны услышать проигрываемый звук! Теперь необходимо просто синхронизировать лицевую анимацию с проигрываемым звуком.
⇐Проигрывание лицевых последовательностей со звуком || Оглавление || Синхронизация анимации со звуком⇒