發(fā)信人: mysunshine() 整理人: wenbobo(2002-12-27 15:58:15), 站內(nèi)信件 | 視頻領(lǐng)域是多煤體的一個重要方面。雖 然Microsoft很早就認(rèn)識了這一點,但 Windows 3.X仍未提供對視頻的內(nèi)置支 持,Windows 3.X對視頻的支持是通過 Video for windows(Vfw)得以實現(xiàn)的。在 Windows 95下,Video for windows不再是 一個獨(dú)立的部分,它被集成進(jìn)了Windows。 AVI(Audio Visual Interface)文件是用于 存儲Windows視頻信號的數(shù)據(jù)文件,本文 以一個AVI文件的播放程序為例,分別討 論利用MCI和MCIWnd兩種方法播放AVI 的程序設(shè)計。
一. 利用MCI播放AVI文件
媒體控制接口(Media Control Interface) 提供了對AVI的支持,利用MCI播放AVI 的方法既適用于Windows 3.X,也適用于 Windows 95。不同的是,在Windows 95下, AVI設(shè)備驅(qū)動程序已被自動安裝完畢,而在 Windows 3.X下,必須自己安裝AVI設(shè)備驅(qū) 動程序。驅(qū)動程序文件名為MCIAVI.DRV, 將此驅(qū)動程序安裝在\WINDOWS\SYSTEM 目錄下,使用SYSTEM.INI文件來裝載此驅(qū) 動程序,裝載驅(qū)動程序的指令在 SYSTEM.INI文件的[MCI]段,如下所示∶ AVIVideo = mciavi.drv 如果安裝了Video for windows,則以上驅(qū)動 程序會被自動安裝。 播放AVI文件可以直接利用MCI函 數(shù),有關(guān)利用MCI函數(shù)播放AVI的過程可 以參見例程。
二.利用MCIWnd播放AVI文件
MCIWnd是Windows 95提供的基于 MCI的窗口類。注意這里的“類”的概念不 同于VC++的“類”,MCIWnd并不屬于 MFC,因此不能從MCIWnd派生類。 一個MCIWnd窗口對象提供了可靠的 方法對媒體播放進(jìn)行控制。圖1是一個正在 播放AVI的MCIWnd,它包含了一個播放/ 暫停按鈕,一個菜單按鈕以及一個進(jìn)度標(biāo) 尺。在窗口內(nèi)擊鼠標(biāo)右鍵將出現(xiàn)一個浮動式 菜單,這個菜單與按菜單按鈕獲得的菜單是 一樣的。
圖1 播放AVI的MCIWnd
在VC++中利用MCIWnd進(jìn)行編程,首 先應(yīng)包含頭文件VFW.H,并在Project Setting下聲明連接庫VFW32.LIB。然后, 創(chuàng)建一個MCIWnd窗口∶ hWnd = MCIWndCreate(hwndParent, hInstance,dwStyle,szFile); 其中,hwndParent為父窗口句柄(擁有 MCIWnd的窗口),hInstance是程序句柄(通 常可以利用AfxGetInstanceHandle()獲得程 序句柄),dwStyle定義了MCIWnd的窗口類 型,szFile是供回放的MCI文件名,可以是 MCI支持的各種類型文件,可以為NULL。 MCIWndCreate()返回MCIWnd的窗口句 柄,用于其他MCI Wnd函數(shù)。 MCIWndCreate()與Windows API的 CreateWindow()有許多相似之處, MCIWndCreate()同樣可以在dwStyle中使用 WS_窗口類型常量,缺省為WS_CHILD| WS_BORDER|WS_VISIBLE。另外, MCIWndCreate()還可以使用MCIWNDF_常 量定義有關(guān)MCIWnd的類型,這些常量包 括∶ MCIWNDF_NOAUTOSIZEWINDOW MCIWNDF_NOPLAYBAR MCIWNDF_NOAUTOSIZEMOVIE MCIWNDF_NOMENU MCIWNDF_SHOWNAME MCIWNDF_SHOWPOS MCIWNDF_SHOWMODE MCIWNDF_SHOWALL MCI提供了兩種方法對媒體播放進(jìn)行 控制∶ 利用MCIWnd窗口上的按鈕或菜單 進(jìn)行直接控制,這些控件提供了各種可能的 對媒體播放的控制;。 用戶編制程序進(jìn)行間接控制 MCIWnd API提供了許多函數(shù)(實際上 是宏)對媒體播放進(jìn)行控制,所有這些函數(shù) 都使用創(chuàng)建時獲取的HWND句柄作為參 數(shù),返回一個long的值,0代表成功,其它 為錯誤碼。一些常用的控制函數(shù)如下∶ MCIWndHome(hWnd) 至起始位置 MCIWndPause(hWnd) 暫停 MCIWndPlay(hWnd) 開始播放 MCIWndPlayFrom(hWnd,lPos) 從lPos播放 MCIWndPlayFromTo(hWnd,lStart,lEnd) 從lStart播到lEnd MCIWndPlayTo(hWnd,lPos) 播放至lPos MCIWndResume(hwnd) 暫停后繼續(xù) MCIWndSeek(hWnd,lPos) 尋道 MCIWndSetVolume(hWnd,iVol) 設(shè)置音量 MCIWndStop(hWnd) 停止播放 另外,MCIWnd還通過一些函數(shù)提供有 關(guān)MCIWnd的信息,這些信息與MCIWnd 所控制的MCI設(shè)備有關(guān)。這些函數(shù)有∶ LRESULT MCIWndCanPlay(hWnd) MCI設(shè)備能否播放數(shù)據(jù) LRESULT MCIWndCanEject(hWnd) MCI設(shè)備是否具有“彈出”特性 LONG MCIWndGetEnd(hWnd) 結(jié)束位置(對Video為,最后楨號) LONG MCIWndGetLength(hWnd) 長度(對Video為楨數(shù)) LONG MCIWndGetPosition(hWnd) 當(dāng)前位置(對Video為楨號) LONG MCIWndGetVolumn(hWnd) 當(dāng)前音量 MCIWndClose(hWnd) 關(guān)閉MCI設(shè)備(并不關(guān)閉MCIWnd) MCIWndDdetroy(hWnd) 關(guān)閉MCIWnd MCIWndSendString(hWnd,sz) 向MCI設(shè)備發(fā)送sz命令
三.AVI播放例程 以下是一個AVI播放的例程,如圖2 所示,該例程使用了MCI控制接口以及 MCIWnd兩種方法播放AVI文件,該例程 在Windows 95下用Visual C++ 4.0通過。
圖2 AVI播放例程
可按如下方法建立VIDEO例程∶ 1. 利用AppWizard建立一Dialog工程 2. 在VIDEODLG.H中加入mmsystem.h和 vfw.h,link設(shè)置中加入庫winmm.lib和 vfw32.lib。 3. 建立對話框模板,加入與按鈕對應(yīng)的變量 Cstring mCommandString; Cstring mErrorString; Cstring mReturnString; 4. 在VideoDlg.h中加入MCIWnd句柄聲明 HWND mVideoWnd; 5. 利用ClassWizard加入消息處理函數(shù)框架 6. 加入如下的消息處理代碼 void CVideoDlg::OnMciSendString() { DWORD mciError; char reply[BUF_SIZE]; char mciErrorString[BUF_SIZE]; UpdateData(TRUE); mciError = mciSendString(mCommandString, reply,BUF_SIZE,NULL); mciGetErrorString(mciError,mciErrorString,BU F_SIZE); mReturnString = reply; mErrorString = mciErrorString; UpdateData(FALSE); }
void CVideoDlg::OnMciSendcommand() { MCI_OPEN_PARMS mciOpenParms; MCI_PLAY_PARMS mciPlayParms; int wDeviceID; DWORD mciError; char mciErrorString[BUF_SIZE]; UpdateData(TRUE); mciOpenParms.dwCallback = 0L; mciOpenParms.wDeviceID = 0; mciOpenParms.lpstrDeviceType = "avivideo"; mciOpenParms.lpstrElementName=(LPCSTR)m CommandString; mciError = mciSendCommand(0,MCI_OPEN, MCI_OPEN_TYPE|MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&mciOpenParms); if (!mciError) { wDeviceID = mciOpenParms.wDeviceID; mciPlayParms.dwCallback = (DWORD)this- > m_hWnd; mciError = mciSendCommand(wDeviceID, MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)& mciPlayParms); }
mciGetErrorString(mciError,mciErrorString,BU F_SIZE); mErrorString = mciErrorString; mReturnString = ""; UpdateData(FALSE); return; } LONG CVideoDlg::OnMCINotify(UINT wParam, LONG lParam) { DWORD mciError; char mciErrorString[BUF_SIZE]; mciError= iSendCommand(LOWORD(lParam), MCI_CLOSE,MCI_WAIT,NULL); mciGetErrorString(mciError,mciErrorString,BU F_SIZE); mErrorString = mciErrorString; UpdateData(FALSE); return 0; }
void CVideoDlg::OnOpenMciwnd() { if (mVideoWnd==NULL) { UpdateData(TRUE); mVideoWnd = MCIWndCreate(this->m_hWnd, AfxGetInstanceHandle(),WS_CAPTION|WS_V ISIBLE|MCIWNDF_SHOWPOS|MCIWNDF_SHOW NAME,(LPCSTR)mCommandString); mErrorString = ""; mReturnString = ""; UpdateData(FALSE);
SetDlgItemText(IDC_OPENMCIWND,"Close MCIWnd"); } else { MCIWndDestroy(mVideoWnd); mVideoWnd = NULL; mErrorString = ""; mReturnString = ""; UpdateData(FALSE);
SetDlgItemText(IDC_OPENMCIWND,"Open MCIWnd"); }
-- ※ 來源:.月光軟件站 http://www.moon-soft.com.[FROM: 155.69.4.55]
| |