1. 程式人生 > >VC++2003/2005/2008 呼叫Mediaplayer的指南,

VC++2003/2005/2008 呼叫Mediaplayer的指南,

               

通過對CWMPPlayer4、CWMPSettings和CWMPControls等幾個類的使用可以實現Windows Media Player的大部分常規功能,如果需要做進一步的控制,可以在用下面這些函式返回相關類物件後呼叫相關成員函式來加以實現:  GetCurrentMedia() 返回CWMPMedia類物件  GetMediaCollection() 返回CWMPMediaCollection類物件  GetPlaylistCollection() 返回CWMPPlaylistCollection類物件   GetNetwork() 返回CWMPNetwork類物件  GetCurrentPlaylist() 返回CWMPPlaylist類物件  GetCdromCollection() 返回CWMPCdromCollection類物件  GetClosedCaption() 返回CWMPClosedCaption類物件  GetError() 返回CWMPError類物件  GetDvd() 返回CWMPDVD類物件  GetPlayerApplication() 返回CWMPPlayerApplication類物件

1、新建一個基於對話方塊的mfc應用程式。

2、在工具箱上點右鍵選擇“選擇項”,開啟com元件,選擇windows media player新增到工具箱上。

3、把media控制元件拖到窗體上.選中窗體。在選單上選擇 專案-〉新增類-〉MFC->activex控制元件中的mfc類-〉新增。

4、選擇 windows media player<1.0>,新增IWMPControls類。

5、在xxxDlg.h中新增:

#include "CWMPControls.h"

。。。

public: COcx1 mm;//Ocx1為media控制元件,mm為控制元件變數。 CWMPControls  m_control;

6、在xxxDlg.cpp檔案中OnInitDialog()函式中新增:

 m_control = static_cast<CWMPControls>(mm.get_controls());

7、現在你可以用mm.put_URL去幹你的事情了。

另外一種辦法,直接用COM操作,例如:       CAxWindow                *m_pView;    CComObject<IWMPPlayer4>   m_spPlayer;        RECT rcClient;    CComPtr<IObjectWithSite>  spHostObject;    CComPtr<IAxWinHostWindow> spHost;    CComObject<CRemoteHost>   *pRemoteHost = NULL;        //建立ActiveX控制元件容器    AtlAxWinInit();    m_pView = new CAxWindow();      if(!m_pView)    {        hr = E_OUTOFMEMORY;    }        if(SUCCEEDED(hr))    {        ::GetWindowRect(GetDlgItem(IDC_RANGE), &rcClient);        ScreenToClient(&rcClient);        m_pView->Create(m_hWnd, rcClient, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,                                              WS_EX_CLIENTEDGE);        if(::IsWindow(m_pView->m_hWnd))        {            hr = m_pView->QueryHost(IID_IObjectWithSite, (void **)&spHostObject);        if(!spHostObject.p)        {          hr = E_POINTER;         }        }    }        //建立 IServiceProvider and IWMPRemoteMediaServices    if(SUCCEEDED(hr))    {        hr = CComObject<CRemoteHost>::CreateInstance(&pRemoteHost);        if(pRemoteHost)        {            pRemoteHost->AddRef();        }        else    {         hr = E_POINTER;    }    }        //Set site to the remote host    if(SUCCEEDED(hr))    {        hr = spHostObject->SetSite((IWMPRemoteMediaServices *)pRemoteHost);    }

    if(SUCCEEDED(hr))    {        hr = m_pView->QueryHost(&spHost);    if(!spHost.p)    {      hr = E_NOINTERFACE;    }    }

    //建立WindowsMediaPlayer的控制元件    if(SUCCEEDED(hr))    {        hr = spHost->CreateControl(CComBSTR(L"{6BF52A52-394A-11d3-B153-00C04F79FAA6}"),                                  m_pView->m_hWnd, NULL);    }

    if(SUCCEEDED(hr))    {        hr = m_pView->QueryControl(&m_spPlayer);    if(!m_spPlayer.p)    {         hr = E_NOINTERFACE;    }    }

    // Set skin to be custom skin    if(SUCCEEDED(hr))    {        DispEventAdvise(m_spPlayer); // Hook the event listener        hr = m_spPlayer->put_uiMode(CComBSTR(_T("custom")));    }        ......        m_spPlayer->put_URL(...);    CComPtr<IWMPControls> spControls;    m_spPlayer->get_controls(&spControls);    if(spControls.p)    {        spControls->play();    }          ......

首先,建立一個對話方塊,然後在資源管理器中右擊對話方塊,選擇“插入Active控制元件”〉選擇windows media player—〉將控制元件拉到適合大小〉右擊player控制元件〉選擇新增變數(m_avPlayer)。此時新增的變數在VS2003中不在時IWMPPlay4 了,而是COcx

<?XML:NAMESPACE PREFIX = O />

右擊類檢視/解決方案〉新增類〉選擇“Active中的MFC類”〉選擇windows media player<1.0>à選擇相應的介面(IWMPMedia IWMPSettings IWMPControls IWMPPlaylist等等)生成類。為圖方便,我將所有介面都生成了相應的類。

為了說明方便,我在對話方塊中放了幾個按鈕,分別是:開啟,播放,暫停,停止,新增。並在對話方塊右邊添加了一個clistctrl又來顯示播放列表。

然後在對話方塊標頭檔案中添加了以下變數:

CWMPControls m_control;

CWMPSettings m_set;

CWMPPlaylistm_playlist;

CWMPMedia m_media;

COcx<?XML:NAMESPACE PREFIX = ST1 />1 m_avPlayer;

CListCtrl m_listCtrl;

media player 的主要功能有:播放控制,螢幕顯示,播放列表,播放列表集,播放資訊顯示。

l其中播放控制又有:開啟,開始,暫停,停止,快速播放,倒退等等。

1.開啟:當選擇一個檔案開啟是,可以直接使用m_avPlayer.put_URL(fileName)

為開啟按鈕新增訊息響應函式,在函式中新增如下程式碼

char szFileFilter[]=

"Mp3 File(*.mp3)|*.mp3|"

"MPEG File(*.mpeg)|*.mpeg|"

"Media File(*.asf)|*.asf|"

"Video File(*.dat)|*.dat|"

"MPGA File(*.mpga)|*.mpga|"

"Wave File(*.wav)|*.wav|"

"AVI File(*.avi)|*.avi|"

"Movie File(*.mov)|*.mov|"

"Mid File(*.mid;*,rmi)|*.mid;*.rmi|"

"Wma File(*.wma)|*.wma|"

"All File(*.*)|*.*||";

CFileDialog fileDialog( TRUE,NULL,NULL,NULL,szFileFilter,this);

if (fileDialog.DoModal() == IDOK)

{

CStringfileName=fileDialog.GetPathName();

m_avPlayer.put_URL(fileName);

}

這樣當選擇一個播放檔案後,media player就會自動播放該檔案了。

2.開始:為了實現播放控制,在OnInitDialog()中新增程式碼:

m_control = static_cast<CWMPControls>(m_avPlayer.get_controls());

然後為開始按鈕新增訊息響應函式,並在函式中新增程式碼:

m_control.play();

3.暫停:m_control.pause();

4.停止:m_control.stop();

5.其他如倒退,快速播放,MSDN上有相應的函式,讀者可依次自行解決。

到此,一個帶有簡單播放控制的播放器就完成。

l下面來實現播放列表。為實現播放列表控制,首先在OnInitDialog()中新增程式碼:

//建立一個播放列表

m_playlist = static_cast<CWMPPlaylist>(m_avPlayer.get_currentPlaylist());

然後將開啟按鈕的訊息響應函式改為:

char szFileFilter[]=

"Mp3 File(*.mp3)|*.mp3|"

"MPEG File(*.mpeg)|*.mpeg|"

"Media File(*.asf)|*.asf|"

"Video File(*.dat)|*.dat|"

"MPGA File(*.mpga)|*.mpga|"

"Wave File(*.wav)|*.wav|"

"AVI File(*.avi)|*.avi|"

"Movie File(*.mov)|*.mov|"

"Mid File(*.mid;*,rmi)|*.mid;*.rmi|"

"Wma File(*.wma)|*.wma|"

"All File(*.*)|*.*||";

CFileDialog fileDialog( TRUE,NULL,NULL,NULL,szFileFilter,this);

if (fileDialog.DoModal() == IDOK)

{

CStringfileName=fileDialog.GetPathName();

//建立一個媒體

m_media = static_cast<CWMPMedia>(m_avPlayer.newMedia(fileName));

//將媒體新增到播放列表

m_playlist.appendItem(m_media);

//將列表新增到當前列表,以便實現自動播放

m_avPlayer.put_currentPlaylist(m_playlist);

m_set = (CWMPSettings)m_avPlayer.get_settings();

//引數true設定自動播放,false不設定自動播放

m_set.put_autoStart(true);

//將媒體的名字新增到列表控制元件

m_listCtrl.InsertItem(0, m_media.get_name());

}

l接著是螢幕顯示控制

m_avPlayer.put_fullScreen(true/false);

l使用播放列表自動播放檔案,第一步: 需要在播放列表中新增媒體;第二步:將列表設定為當前播放列表;第三步:將播放設定為自動播放。

函式如下:

//建立媒體

m_media = static_cast<CWMPMedia>(m_avPlayer.newMedia(fileName));

//將媒體追加到播放列表

m_playlist.appendItem(m_media);

//將類別設定為當前列表

m_avPlayer.put_currentPlaylist(m_playlist);

//設定自動播放

m_setting.put_autoStart(true);

l播放資訊的顯示

可以通過CWMPMedia類獲取相關的媒體資訊。

獲取播放檔名:media.get_name()