天天看點

使用DirectShow播放MP3,實作循環播放,顯示播放進度

控制台程式,未寫UI,有興趣的話,可以寫寫UI

軟體:VS2010

代碼如下:

#include<Windows.h>

#include<iomanip>

#include<DShow.h>

#include<iostream>

using namespace std;

#pragma comment(lib,"strmiids.lib")

IGraphBuilder   *g_pGraphBuilder=NULL;   //幫助建立濾波圖,濾波過濾圖是一組對象或接口的集合,用于處理某種媒體檔案。

IMediaControl   *g_pMediaControl=NULL;   //控制資料在濾波圖中的流程,使用該接口控制音樂的回放。

IMediaEvent     *g_pMediaEvents=NULL;    //從濾波圖中擷取事件及通告,當希望知道在濾波圖中發生了什麼的時候這個對象很有用,比如希望知道一個音樂是否仍然在播放或者已經停止播放。

IBasicAudio     *g_pBasicAudio=NULL;     //控制音量

IMediaSeeking   *g_pMediaSeeking=NULL;   //擷取/控制  播放位置

void Release()

{

if(g_pMediaControl!=NULL)g_pMediaControl->Stop();

if(g_pMediaEvents!=NULL)

{

g_pMediaEvents->Release();

g_pMediaEvents = NULL;

}

if(g_pMediaControl!=NULL)

{

g_pMediaControl->Release();

g_pMediaControl = NULL;

}

if(g_pGraphBuilder!=NULL)

{

g_pGraphBuilder->Release();

g_pGraphBuilder = NULL;

}

}

void PlayMusic(LPCWSTR fileName)

{

//如果是中文則不能簡單的使用 L 轉換,需使用mbstowcs函數或者MultiByteToWideChar進行轉換

g_pGraphBuilder->RenderFile(fileName,NULL);

//g_pMediaControl有Run/Stop/Pause/StopWhenReady等函數,可以寫個UI控制

g_pMediaControl->Run();

}

void HandleEvent()

{

while(TRUE)

{

long event_code, param1, param2;

if(SUCCEEDED(g_pMediaEvents->GetEvent(&event_code, &param1, &param2, 1)))

{

if(event_code == EC_COMPLETE)

{

//重新開始播放也可用g_pMediaSeeking的SetPositions來實作

g_pMediaControl->Stop();

PlayMusic(L"ten minutes.mp3");

}

g_pMediaEvents->FreeEventParams(event_code, param1, param2);

}

__int64 Len=-1,Pos=-1;

g_pMediaSeeking->GetDuration (&Len);

g_pMediaSeeking->GetCurrentPosition(&Pos);

cout<<"播放進度:"<<"【"<<setw(8)<<(double)Pos/Len*100<<"%】"<<endl;

Sleep(500);

}

}

int main()

{

CoInitialize(NULL);

if(FAILED(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder,(void**)&g_pGraphBuilder)))

{

   cout<<"CoCreateInstance failed"<<endl;

goto END;

}

g_pGraphBuilder->QueryInterface(IID_IMediaControl, (void**)&g_pMediaControl);

g_pGraphBuilder->QueryInterface(IID_IMediaEvent, (void**)&g_pMediaEvents);

g_pGraphBuilder->QueryInterface(IID_IBasicAudio, (void**)&g_pBasicAudio);

g_pGraphBuilder->QueryInterface(IID_IMediaSeeking, (void**)&g_pMediaSeeking);

//使用DShow可以同時播放幾個檔案,實作混音效果!而mciSendCommand則不能

PlayMusic(L"ten minutes.mp3");

    //PlayMusic(L"bg.mp3");

//事件處理(循環播放、顯示播放進度等)

HandleEvent();

END:

system("pause");

Release();

CoUninitialize();

return 0;

}

繼續閱讀