實驗六 媒體播放器實現(xiàn)_第1頁
實驗六 媒體播放器實現(xiàn)_第2頁
實驗六 媒體播放器實現(xiàn)_第3頁
實驗六 媒體播放器實現(xiàn)_第4頁
實驗六 媒體播放器實現(xiàn)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

實驗六媒體播放器實現(xiàn)1.上機(jī)實驗報告六課程名稱:多媒體技術(shù)班級:數(shù)媒**班實驗日期:2014.5.25-6.2小組成員:指導(dǎo)教師:實驗序號:06實驗成績:一、簡單媒體播放器實現(xiàn)實驗?zāi)康募耙竽康模菏褂肰C++2005進(jìn)行編程,基于控制臺應(yīng)用程序,使用DirectShowSDK實現(xiàn)流媒體播放器。要求:1、掌握使用DirectSound中常用接口完成音視頻媒體回放、顯示及控制等動作的方法;2、利用接口中的控制函數(shù)完成控制操作;3、學(xué)會面向?qū)ο蟮脑O(shè)計方法;3、開發(fā)一個簡單的基于控制臺應(yīng)用程序的媒體播放程序。三、實驗環(huán)境本次上機(jī)實踐所使用的平臺和相關(guān)軟件VS2012MFC\win7實驗內(nèi)容平臺搭建DirectX是一個多媒體API,提供了與顯卡、聲卡、輸入設(shè)備等進(jìn)行交互的標(biāo)準(zhǔn)接口。如果沒有這個標(biāo)準(zhǔn)API,則將必須為每個顯卡和聲卡組合以及每種類型的鍵盤、鼠標(biāo)和手柄編寫不同的代碼。而DirectShow是微軟為簡化或降低音頻/視頻開發(fā)的難度而為音視頻應(yīng)用開發(fā)人員定制的一套API函數(shù)。是DirectX的一個組件,提供對多媒體數(shù)據(jù)流的高質(zhì)量捕獲和回放。不必關(guān)注視頻硬件如顯卡、視頻捕捉設(shè)備、視頻編碼算法、解碼算法,音/視頻數(shù)據(jù)同步等復(fù)雜細(xì)節(jié)。此次在VS下媒體播放器的實現(xiàn)即需要DirectShow的有關(guān)靜態(tài)庫的配置和開發(fā)環(huán)境的配置。由于VS2012無需配置DirectX,用戶可直接編譯DirectShow里的baseclasses,選擇成批編譯,生成四個版本的靜態(tài)庫Debug、Debug_Unicode、Release、Release_Unicode。為了能讓VSc++自動搜索到SDK庫和頭文件,需對媒體播放工程進(jìn)行環(huán)境配置。(1)在include路徑下添加DirectShow中的BaseClasses\、include、Common。(2)在lib路基下添加DirectShow中的Debug、Debug_Unicode、Release、Release_Unicode。實現(xiàn)的基本功能:打開/關(guān)閉媒體文件播放/暫停/停止媒體全屏顯示音量控制抓圖靜音控制播放時總位于頂層增加的功能:屏幕縮放比例退出播放時長的顯示未來擴(kuò)展功能:希望實現(xiàn)前一個、下一個視頻的播放

3.功能介紹:點擊“打開”,添加播放資源*.mpg;*.mpeg;*.avi;*.rmvb;*.rm;*.mp3;*.mid;*.wav;*.mov;*.qt;*.wmv;*.wma;*.asf2、單擊“播放”,開始播放或重新播放3、點擊“暫停”,暫停播放視頻(只在視頻播放時才可以生效);4、單擊“終止”,視頻播放停止(只在視頻播放時才可以生效);5、滑動音量滑塊調(diào)節(jié)音量大小(有左聲道和右聲道)6、可以選擇menu的各個功能,如抓圖,縮放,全屏,退出,幫助里的關(guān)于等。調(diào)試過程及實驗結(jié)果實驗效果圖:總結(jié)通過這次實驗,體會到了DirectShow的強大功能,為用戶開發(fā)節(jié)省了很多時間。例如DirectShow的視頻窗口接口有專門的方法支持全屏顯示功能,因此我們只需boolCDXGraph::SetFullScreen(BOOLinEnabled){ if(pVideoWindow) { HRESULThr=pVideoWindow->put_FullScreenMode(inEnabled?OATRUE:OAFALSE); returnSUCCEEDED(hr); } returnfalse;}即可實現(xiàn)全屏顯示的功能。但是不足的是我未能使用GraphEdit管理濾波器的插入、連接和運行,快速構(gòu)建一個使用DitectShow的濾波器鏈表。在鏈接濾波器引腳時,無法鏈接。主要原因是對GraphEdit不是很熟悉,時間來不及。附錄核心代碼:voidCDSPlayerDlg::OnFileOpenQuick(){ CStringstrFilter; strFilter="媒體文件(所有類型)|*.mpg;*.mpeg;*.avi;*.rmvb;*.rm;*.mp3;*.mid;*.wav;*.mov;*.qt;*.wmv;*.wma;*.asf|"; strFilter+="AllFiles(*.*)|*.*|"; CFileDialogdlgOpen(TRUE,NULL,NULL,OFN_PATHMUSTEXIST|OFN_HIDEREADONLY, strFilter,this); if(IDOK==dlgOpen.DoModal()) { PlayFile(dlgOpen.m_ofn.lpstrFile); }}voidCDSPlayerDlg::OnSize(UINTnType,intcx,intcy){ CDialog::OnSize(nType,cx,cy); CRectrc; GetClientRect(&rc); rc.top=rc.bottom-m_Bar.GetHeight(); m_Bar.MoveWindow(&rc); GetClientRect(&rc); rc.bottom-=m_Bar.GetHeight(); m_videowindow.MoveWindow(&rc); if(m_pGraph) { CRectrc; GetClientRect(&rc); rc.bottom-=m_Bar.GetHeight(); m_videowindow.MoveWindow(&rc); m_pGraph->SetWindowPos(&rc); } DrawLogo();}voidCDSPlayerDlg::OnFileClose(){ DestroyGraph(); m_Bar.EnableToolButton(false); m_Bar.EnableSlider(false); SetTimer(TIMER_DRAWLOGO,10,NULL); m_Bar.DrawStatusBar(); SetWindowText("MediaPlayerClassic");}voidCDSPlayerDlg::OnFileShot(){ CTimet=CTime::GetCurrentTime(); CStrings=t.Format("D:\\%y_%m_%d_%H_%M_%S.BMP"); if(m_pGraph->SnapshotBitmap(s)) MessageBox(CString("截圖成功,保存為")+s);}voidCDSPlayerDlg::OnMenuSelect(UINTnItemID,UINTnFlags,HMENUhSysMenu){ CDialog::OnMenuSelect(nItemID,nFlags,hSysMenu); CCmdUIcmdUI;CMenu*pMainMenu=GetMenu();CMenu*pSubMenu=pMainMenu->GetSubMenu(nItemID);if(IsMenu(pSubMenu->GetSafeHmenu())){cmdUI.m_nIndexMax=pSubMenu->GetMenuItemCount();for(UINTi=0;i<cmdUI.m_nIndexMax;++i){cmdUI.m_nIndex=i;cmdUI.m_nID=pSubMenu->GetMenuItemID(i);cmdUI.m_pMenu=pSubMenu;cmdUI.DoUpdate(this,FALSE);}}}voidCDSPlayerDlg::OnClose(){ DestroyGraph(); CDialog::OnClose();}voidCDSPlayerDlg::OnPlay(){ if(m_pGraph) { m_pGraph->Play(); SetTimer(TIMER_POSITION,100,NULL); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_PLAY,TBSTATE_CHECKED|TBSTATE_ENABLED); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_PAUSE,TBSTATE_ENABLED); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_STOP,TBSTATE_ENABLED); m_Bar.EnableSlider(true); SetVolumeAndBalance(); m_Bar.DrawStatusBar(); }}voidCDSPlayerDlg::OnPause(){ if(m_pGraph) { m_pGraph->Pause(); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_PLAY,TBSTATE_ENABLED); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_PAUSE,TBSTATE_CHECKED|TBSTATE_ENABLED); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_STOP,TBSTATE_ENABLED); m_Bar.DrawStatusBar(); }}voidCDSPlayerDlg::OnStop(){ if(m_pGraph) { KillTimer(TIMER_POSITION); m_pGraph->SetPosition(0); m_pGraph->Stop(); m_Bar.SetSliderPos(0); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_PLAY,TBSTATE_ENABLED); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_PAUSE,TBSTATE_ENABLED); m_Bar.m_ToolBar.GetToolBarCtrl().SetState(ID_STOP,TBSTATE_CHECKED|TBSTATE_ENABLED); m_Bar.EnableSlider(false); m_Bar.DrawStatusBar(); }}voidCDSPlayerDlg::OnTimer(UINTnIDEvent){ switch(nIDEvent) { caseTIMER_POSITION: { if(m_pGraph) { __int64pos=m_pGraph->GetPosition(); __int64len=m_pGraph->GetLength(); m_Bar.SetSliderPos(int(pos*10000/len)); m_Bar.DrawStatusBar(); } break; } caseTIMER_DRAWLOGO:{ DrawLogo(); KillTimer(TIMER_DRAWLOGO); break; } } CDialog::OnTimer(nIDEvent);}voidCDSPlayerDlg::OnPlayFullScreen(){ if(m_pGraph) { m_videowindow.m_bDrawCursor=m_pGraph->GetFullScreen(); m_pGraph->SetFullScreen(!m_pGraph->GetFullScreen()); }}voidCDSPlayerDlg::OnUpdateFileShot(CCmdUI*pCmdUI){ if(m_pGraph) pCmdUI->Enable(m_pGraph->IsHaveVideo()); else pCmdUI->Enable(false);}voidCDSPlayerDlg::OnUpdateFileClose(CCmdUI*pCmdUI){ if(m_pGraph) pCmdUI->Enable(m_pGraph->IsPaused()||m_pGraph->IsRunning()||m_pGraph->IsStopped()); else pCmdUI->Enable(false);}voidCDSPlayerDlg::OnUpdateFileFullScreen(CCmdUI*pCmdUI){ if(m_pGraph) pCmdUI->Enable(m_pGraph->IsHaveVideo()); else pCmdUI->Enable(false);}voidCDSPlayerDlg::OnUpdatePause(CCmdUI*pCmdUI){ if(m_pGraph==NULL) { pCmdUI->Enable(false); return; } pCmdUI->Enable(); pCmdUI->SetCheck(m_pGraph->IsPaused());}voidCDSPlayerDlg::OnUpdatePlay(CCmdUI*pCmdUI){ if(m_pGraph==NULL) { pCmdUI->Enable(false); return; } pCmdUI->Enable(); pCmdUI->SetCheck(m_pGraph->IsRunning());}voidCDSPlayerDlg::OnUpdateStop(CCmdUI*pCmdUI){ if(m_pGraph==NULL) { pCmdUI->Enable(false); return; } pCmdUI->Enable(); pCmdUI->SetCheck(m_pGraph->IsStopped());}voidCDSPlayerDlg::OnHelpAbout(){ CAboutDlgdlg; dlg.DoModal();}voidCDSPlayerDlg::SetVolumeAndBalance(){ if(m_pGraph) { m_pGraph->SetAudioBalance(m_Bar.GetBalanceValue()); m_pGraph->SetAudioVolume(m_Bar.GetVolumeValue()); }}voidCDSPlayerDlg::DrawLogo(){ CRectrc; m_videowindow.GetClientRect(&rc); CDCmemDC; CClientDCClientDlgDC(m_videowindow.FromHandle(m_videowindow.m_hWnd)); CBrushbrush; brush.CreateSolidBrush(RGB(0,0,0)); ClientDlgDC.FillRect(&rc,&brush); CBitmapBitmap,*oldBitmap; BITMAPbmpInfo; intnWidth,nHeight; memDC.CreateCompatibleDC(&ClientDlgDC); Bitmap.LoadBitmap(IDB_LOGO); Bitmap.GetBitmap(&b

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論