2015-11-23 3 views
0

Мне нужно написать программу, которая может воспроизводить файл .ogg Vorbis с помощью IGraphBuilder или любого другого API окон напрямую (в C++/win32 API)?Как играть в ogg файлы Vorbis с использованием IGraphBuilder

Я пробовал с IGraphBuilder, но это не работает для меня. Пример кода:

IMediaControl *pControl = NULL; 
IGraphBuilder *pGraph= NULL; 
IMediaEventEx *pEvent= NULL; 
IMediaPosition *pMediaPosition= NULL; 

hr = ::CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
         IID_IGraphBuilder, (void **)&pGraph); 
if (FAILED(hr)) { 
    return false; 
} 

hr = pGraph->AddFilter(pFilter, L"Out"); 
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl); 
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent); 
hr = pGraph->QueryInterface(IID_IMediaPosition, (void**)&pMediaPosition); 

// Build the graph. 
hr = pGraph->RenderFile(mFilePath.c_str()/*"C:\\sample.ogg file"*/, NULL); 

/* here hr = 0x80040265 so SUCCEEDED(hr) didnt allow it to enter in if condition*/ 
if (SUCCEEDED(hr)) { 
    // Run the graph. 
    hr = pControl->Run(); 
    if (SUCCEEDED(hr)) { 
     // Wait for completion. 
     long evCode; 
     pEvent->WaitForCompletion(INFINITE, &evCode); 
    } 
} 

// Clean up in reverse order. 
SAFE_RELEASE(pEvent); 
SAFE_RELEASE(pControl); 
SAFE_RELEASE(pGraph); 
pGraph = NULL; 

::CoUninitialize(); 

Примечание: Выше заявление hr = pGraph->RenderFile() возвращали ч = 0x80040265 и условие if (SUCCEEDED(hr)) оленья кожа позволяют играть.

Если я не использую это условие, то pControl->Run() будет выполнен с возвратом ID_OK. Но с динамиком ничего не играло. Пожалуйста, предложите решение/метод.

+1

Что означает «что не работает для меня»? Ошибки? Единороги танцуют? Что-то другое? –

+0

Спасибо за ответ. RenderFile() возвращена hr = 0x80040265. Я добавил вопрос для большей ясности. – KrishPS

+1

В случае 'IGraphBuilder :: RenderFile()', что HRESULT сопоставляется с 'VFW_E_UNSUPPORTED_STREAM', что в основном означает, что ваша установка не поддерживает воспроизведение файлов Ogg Vorbis. Вам нужно будет установить фильтр, который позволяет DirectShow воспроизводить файлы Ogg Vorbis, такие как [официальный из Xiph] (https://xiph.org/dshow/). – andlabs

ответ

2

Обращаем внимание на код ошибки HRESULT; они что-то значат. MSDN часто помогает с кодами функций, такими как тот, который вы получили. (С достаточным программированием на COM вы сможете распознать обычные, например, E_INVALIDARG.) Если нет, вы можете использовать свои файлы заголовков для определения потенциальных кодов ошибок. HRESULT s имеют определенный формат; узнать его!

В случае IGraphBuilder::RenderFile(), что HRESULT соответствует VFW_E_UNSUPPORTED_STREAM, что в основном означает, что ваша установка не поддерживает воспроизведение файлов Ogg Vorbis. Вам нужно будет установить фильтр, который позволяет DirectShow воспроизводить файлы Ogg Vorbis, такие как the official one from Xiph.Org.