求助:vc如何实现简单的播放和暂停音乐(mp3格式)?

解决方案 »

  1.   

    http://www.wei2008.com/Code/Down/33888.html
      

  2.   


    MCI可以支持所有格式的音频?
      

  3.   

    如果你说的是.mp3的格式  MCI完全可以支持
      

  4.   

    可以使用开源mpg123库解码mp3, 然后使用wave API播放, 整个过程都由自己控制, 暂停自然非常容易实现了.
      

  5.   

    VC++ API 播放MP3 
      

  6.   

    用DirectShow实现.可以播放很多种格式的声音文件.
      

  7.   

    给你个Sample.先打开后播放
    E_AUDIO_RESULT XXX::Open(LPCTSTR lpszFileName)
    {
    try
    {
    HRESULT hr = S_OK;
    StopAudio();
    ReleaseHandle();
    bool bNeedDecode = false;
    if (IsValidAudioFile(lpszFileName, bNeedDecode))
    {
    if (bNeedDecode)
    {
    ::DeleteFile(m_tszTempFileName);

    E_AUDIO_RESULT eAudioResult= DecodeAudioFile(lpszFileName, m_tszTempFileName);
    if( eAudioResult == eOK)
    lpszFileName = m_tszTempFileName;
    else
    return eAudioResult;
    }
    }
    else
    return eNotSupportFormat;
    //create the interface
    if (FAILED(hr = CoCreateInstance(CLSID_FilterGraph, NULL,
    CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pIGraphBuilder)))
    {
    return eError;
    }
    // Get the media event interface before building the graph
    if (FAILED(hr = m_pIGraphBuilder->QueryInterface(IID_IMediaEventEx, (void **)&m_pIMediaEventEx)))
    {
    return eError;
    } if (m_pIGraphBuilder == NULL)
    {
    assert(0);
    return eError;
    } // Have the graph builder construct the appropriate graph automatically
    if (FAILED(hr = m_pIGraphBuilder->RenderFile((LPCWSTR)lpszFileName, NULL)))
    {
    return eError;
    }
    if (SUCCEEDED(hr))
    {
    if (FAILED(hr = m_pIGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&m_pIMediaControl)))
    {
    return eError;
    }
    if (m_pIMediaControl == NULL) 
    {
    return eError;
    }
    if (FAILED(hr = m_pIGraphBuilder->QueryInterface(IID_IMediaSeeking, (void **)&m_pIMediaSeeking)))
    {
    return eError;
    }
    if (m_pIMediaSeeking == NULL) 
    {
    return eError;
    }
    if (FAILED(hr = m_pIMediaSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME))) 

    return eError;

    if (FAILED(hr = m_pIMediaSeeking->GetDuration(&m_i64TimeCount)))
    {
    return eError;
    }
    /*if (FAILED(hr = m_pIMediaEventEx->SetNotifyWindow((OAHWND)m_lParam,0,0)))
    {
    return eError;
    }*/
    /*hr = CoCreateInstance(__uuidof(IMMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator),
      (void**)&m_pIEnumerator);
    if (SUCCEEDED(hr))
    {
    hr = m_pIEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &m_pIEndpoint);
    if (FAILED(hr))
    {
    return eError;
    } hr = m_pIEndpoint->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void**)&m_pIAudioEndVol);
    if (FAILED(hr))
    {
    return eError;
    }
    }*/ return eOK;
    }
    }
    catch(...)
    {
    return eError;
    }
    return eOK;
    }bool XXX::PlayAudio()
    {
    HRESULT hr = S_OK;
    if (m_ePlayStatus == ePlayStatus_Paused &&
    m_pIMediaControl != NULL)
    {
    hr = m_pIMediaControl->Run();
    if (FAILED(hr))
    {
    return false;
    }
    m_ePlayStatus = ePlayStatus_Running;
    if (m_pfnCallBack)
    {
    m_pfnCallBack(m_ePlayStatus,m_lParam);
    }
    return true;
    }
    if (m_pIMediaControl)
    {
    if (FAILED(hr = m_pIMediaControl->Run()))
    {
    return false;
    }
    m_ePlayStatus = ePlayStatus_Running;
    if (m_pfnCallBack)
    {
    m_pfnCallBack(m_ePlayStatus,m_lParam);
    }
    }
    return true;
    }