Мне нужно написать программу, которая может воспроизводить файл .ogg Vorbis с помощью IGraphBuilder или любого другого Windows API напрямую (в C ++ / win32 API)?
Я пытался с 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()
вернул hr = 0x80040265 и условие if (SUCCEEDED(hr))
не позволяет играть в нее.
Если я не использую это условие, то pControl->Run()
выполняется с возвратом ID_OK. Но ничего не играл с динамиком.
Пожалуйста, предложите решение / метод.
Обрати внимание на HRESULT
коды ошибок; они что-то значат. MSDN часто помогает с кодами ошибок, специфичными для функций, такими как тот, который вы получили. (При достаточном количестве COM-программирования вы сможете распознать такие, как E_INVALIDARG
на вид.) Если нет, вы можете использовать файлы заголовков, чтобы точно определить потенциальные коды ошибок. HRESULT
s имеют определенный формат; узнать его!
В случае IGraphBuilder::RenderFile()
, тот HRESULT
карты для VFW_E_UNSUPPORTED_STREAM
Это означает, что ваша установка не поддерживает воспроизведение файлов Ogg Vorbis. Вам нужно будет установить фильтр, который позволит DirectShow воспроизводить файлы Ogg Vorbis, такие как официальный от Xiph.Org.
Других решений пока нет …