如何使用IGraphBuilder播放ogg Vorbis文件

时间:2015-11-23 12:04:13

标签: c++ winapi windows-7 oggvorbis

我需要编写一个程序,可以直接在IGraphBuilder或任何其他Windows API的帮助下(在C ++ / win32 API中)播放.ogg Vorbis文件吗?

我尝试使用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 个答案:

答案 0 :(得分:2)

注意HRESULT错误代码;他们意味着什么。 MSDN通常对函数特定的错误代码很有帮助,例如你得到的错误代码。 (通过足够的COM编程,您可以通过视觉识别E_INVALIDARG之类的常见编程。)如果没有,您可以使用头文件来查明潜在的错误代码。 HRESULT具有特定格式;学习它!

对于IGraphBuilder::RenderFile()HRESULT映射到VFW_E_UNSUPPORTED_STREAM,这基本上意味着您的设置不支持播放Ogg Vorbis文件。您需要安装允许DirectShow播放Ogg Vorbis文件的过滤器,例如the official one from Xiph.Org