Как воспроизводить файлы ogg Vorbis с помощью IGraphBuilder

Мне нужно написать программу, которая может воспроизводить файл.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. Но ничего не играл с динамиком. Пожалуйста, предложите решение / метод.

1 ответ

Решение

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

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

Другие вопросы по тегам