Windows DirectShow:如何播放多个mp3?

时间:2012-06-25 18:18:03

标签: windows mp3 directshow latency

我必须在我的UI中播放多个声音,例如按钮点击,错误,通知等。为此,我编写了以下代码(以前从未在Windows中播放过mp3):

bool ClientHandler::InitSoundAndMusic()
{
    m_pSoundGraph = NULL;
    m_pSoundControl = NULL;

    HRESULT hr = ::CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder,
                                    (void**) &m_pSoundGraph);

    if (!SUCCEEDED(hr) || !m_pSoundGraph)
        return false;

    hr = m_pSoundGraph->QueryInterface(IID_IMediaControl, (void**) &m_pSoundControl);
    if (!SUCCEEDED(hr) || !m_pSoundControl)
        return false;

    return true;
}

void ClientHandler::PlayFile(LPCTSTR file)
{
    if (!m_pSoundGraph)
        return;

    m_pSoundControl->Stop();
    HRESULT hr = m_pSoundGraph->RenderFile(file, NULL);
    if (SUCCEEDED(hr))
        m_pSoundControl->Run();
}

bool ClientHandler::OnEvent(const String& message)
{
    if (message == _T("button"))
    {
        PlayFile(_T(".\\sound\\button.mp3"));
        return true;
    }

    return false;
}

似乎很慢。当我每秒点击一次按钮~5次时,UI就会冻结。我想,我不应该每次都叫Stop / Render / Run,但我不知道如何避免它。我该如何重写代码?

此致

1 个答案:

答案 0 :(得分:0)

而不是DirectShow,我只是尝试了libzplay(http://libzplay.sourceforge.net/)。

让我引用它的自述文件:

  

如何将libZPlay与C ++一起使用

     
      
  1. 将libzplay.h包含在您的源代码中
  2.   
  3. 包含libZPlay名称空间

         

    使用命名空间libZPlay;

  4.   
  5. 将您的项目与导入库链接。

         

    libzplay.lib - 用于libzplay.dll的VC ++导入库
      libzplay_borland.lib - 用于libzplay.dll的Borland C ++导入库
      libzplay.a - libzplay.dll的MinGW / GCC导入库

  6.   
  7. 创建ZPlay类。

         

    ZPlay * player = CreateZPlay();

  8.   
  9. 打开文件。

         

    if(player-> OpenFile(“mySong.mp3”,sfAutodetect)== 0){     //错误}

  10.   
  11. 开始播放

         

    播放器 - >播放();

  12.   
  13. 最后破坏ZPlay类

         

    播放器 - >推出();

  14.   

工作顺利。我只需打开一次文件,每次需要时都可以调用Play()。在DirectShow中调用Run()不会以相同的方式工作。

正确的图书馆必须如此:30分钟从头开始嵌入坚固的岩石。