1、实验3 数字视频播放器实验2 数字视频播放器实验目的:1. 进一步掌握MCI函数的应用。2. 制作数字视频播放器,并具有以下功能:打开视频播放设备,播放视频文件,可静态观看每一帧视频,并且可设置播放速度,还能在全屏播放与正常播放之间转换。实验步骤:一 如实验1建立应用程序框架二 制作应用程序界面1. 制作对话框对话框控件属性表控件ID标题控件ID标题pictrueIDC_DISPLAY StaticIDC_PLAY_SOUNDGroup BoxIDC_STATIC视频信息StaticIDC_FRAMESStaticIDC_STATIC视频文件名:StaticIDC_DEMENSIONStati
2、cIDC_STATIC播放速度:ButtonIDC_OPEN打开StaticIDC_STATIC是否静音:ButtonIDC_PLAY播放StaticIDC_STATIC视频帧数:ButtonIDC_PAUSE暂停StaticIDC_STATIC视频尺寸:ButtonIDC_PRE上一帧StaticIDC_VIDEO_NAMEButtonIDC_NEXT下一帧StaticIDC_PLAY_SPEEDButtonIDC_STOP停止现在在应用程序中插入一个对话框资源,用来设置播放速度,其ID设为IDD_SPEED:IDD_SPEED对话框控件属性表控件ID标题Edit BoxIDC_SPEED1
3、ButtonIDOK确定ButtonIDCANCEL取消还需象应用程序中插入一个对话框资源,用做视频输出窗口,ID为IDD_DISPLAY。2. 制作菜单插入一个菜单资源,将ID设为IDR_MAINFRAME。IDR_MAINFRAME 中的菜单项菜单标题菜单项标题ID文件打开IDC_OPEN关闭IDC_OK选项静音IDC_SOUND全屏IDC_FULLSCREEN循环播放IDC_LOOP视频速度IDC_SPEED在你的主对话框的属性中的菜单项中,选中IDR_MAINFRAME现在编译一下,就得到了我们所要的界面。3. 添加消息处理函数在C*Dlg中需要添加的消息处理函数ID消息IDC_PLA
4、YBN_CLICKEDIDC_STOPBN_CLICKEDIDC_PAUSEBN_CLICKEDIDC_PREBN_CLICKEDIDC_NEXTBN_CLICKEDIDC_OPENBN_CLICKEDIDC_SPEEDCOMMANDIDC_FULLSCREENCOMMANDIDC_LOOPCOMMANDIDC_SOUNDCOMMANDC*DlgWM_TIMER然后为IDD_SPEED对话框资源添加一个int m_speed成员变量三 完成应用程序功能设计1. 将已设计好的类Cvideo加到你的工程中来,并使C*Dlg的头文件包含该类的头文件,然后在C*Dlg类的声明中加入以下代码:prote
5、cted:CVideo m_Video; bool m_bIsOpen; bool m_bSound; bool m_bLoop; bool m_bFullScreen; CDialog *display;2. 初始化你的主对话框在OnInitDlialog()中/ TODO: Add extra initialization here后加入以下代码: display=new CDialog; display-Create(IDD_DISPLAY); SetTimer(1,100,NULL);3. 完成消息函数OnTimer, OnOpen, OnPlay, OnStop, OnPause,O
6、nPre, OnNext, OnSound, OnLoop, OnFullScreen, OnSpeedvoid CVideoPlayerDlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call default CWnd *m_pWnd=GetDlgItem(IDC_PLAY); m_pWnd-EnableWindow(m_bIsOpen); m_pWnd=GetDlgItem(IDC_PAUSE); m_pWnd-EnableWindow(m_bIsOpen); m_pWnd=GetDl
7、gItem(IDC_STOP); m_pWnd-EnableWindow(m_bIsOpen); m_pWnd=GetDlgItem(IDC_NEXT); m_pWnd-EnableWindow(m_bIsOpen); m_pWnd=GetDlgItem(IDC_PRE); m_pWnd-EnableWindow(m_bIsOpen); if(m_bIsOpen) CString Info; Info.Format(当前播放帧数:%d,m_Video.GetFrame(); m_pWnd=GetDlgItem(IDC_DISPLAY);/获得静态图像控件位置 CClientDC dc(m_pW
8、nd); CRect rect; CBrush brush(COLORREF(0),*OldBrush; OldBrush=(CBrush*)dc.SelectObject(brush); m_pWnd-GetClientRect(rect);/获得静态图像控件大小 dc.SetTextColor(COLORREF RGB(0,0,255); dc.SetBkColor(COLORREF RGB(0,0,0); dc.FillRect(rect,&brush); CSize size=dc.GetTextExtent(Info);/获得文本尺寸 dc.TextOut(rect.Width()-
9、size.cx)/2,(rect.Height()-size.cy)/2,Info); dc.SelectObject(&OldBrush); CString str; str.Format(%d,m_Video.GetSpeed(); SetDlgItemText(IDC_PLAY_SPEED,str); str.Format(%d,m_Video.GetFrames(); SetDlgItemText(IDC_FRAMES,str); if(m_Video.GetSound() str=_T(否); else str=_T(是); SetDlgItemText(IDC_PLAY_SOUND
10、,str); CDialog:OnTimer(nIDEvent);void CVideoPlayerDlg:OnOpen() / TODO: Add your control notification handler code here CString Filter,str; Filter= 视频文件(*.AVI)|*.AVI|; / 得到窗口尺寸 CRect rect; this-GetWindowRect(rect); CFileDialog FileDlg(true,NULL,NULL,OFN_HIDEREADONLY,Filter); if(FileDlg.DoModal()=IDOK
11、)/单击文件选择对话框的“确定”键 if(!m_Video.Open(FileDlg.GetPathName(),display,0,0)/打开视频文件 MessageBox(不能打开文件!,Error,MB_OK|MB_ICONSTOP); return; /将显示屏幕定位在主对话框的下方,并根据视频大小确定屏幕大小 int Border,Caption; Border=GetSystemMetrics(SM_CXSIZEFRAME); Caption=GetSystemMetrics(SM_CYCAPTION); display-SetWindowPos(this,rect.left+30
12、,rect.bottom+30, m_Video.GetWidth()+Border,m_Video.GetHeight()+Caption+Border, SWP_SHOWWINDOW); display-ShowWindow(true); display-SetWindowText(FileDlg.GetFileName(); SetDlgItemText(IDC_VIDEO_NAME,FileDlg.GetFileName(); str.Format(%d%d,m_Video.GetWidth(),m_Video.GetHeight(); SetDlgItemText(IDC_DEMEN
13、SION,str); m_bIsOpen=true; void CVideoPlayerDlg:OnPlay() / TODO: Add your control notification handler code here m_Video.Play(m_bLoop,m_bFullScreen);void CVideoPlayerDlg:OnStop() / TODO: Add your control notification handler code here m_Video.Stop(); void CVideoPlayerDlg:OnPause() / TODO: Add your c
14、ontrol notification handler code here m_Video.Pause();void CVideoPlayerDlg:OnPre() / TODO: Add your control notification handler code here m_Video.Backward(1);void CVideoPlayerDlg:OnNext() / TODO: Add your control notification handler code here m_Video.Forward(1);void CVideoPlayerDlg:OnSound() / TOD
15、O: Add your command handler code here m_bSound=!m_bSound; m_Video.SetSound(m_bSound);void CVideoPlayerDlg:OnSpeed() / TODO: Add your command handler code here CSpeed dlg; dlg.m_speed=m_Video.GetSpeed(); if(dlg.DoModal()=IDOK) m_Video.SetSpeed(dlg.m_speed);void CVideoPlayerDlg:OnFullscreen() / TODO:
16、Add your command handler code here m_bFullScreen=!m_bFullScreen;void CVideoPlayerDlg:OnLoop() / TODO: Add your command handler code here m_bLoop=!m_bLoop;现在编译执行,视频播放器变完成了。实验注意事项:1. 调试程序时,Ctrl+F7 为Compile,Build为F7,运行时按F5。2. 注意可重用类CVideo的设计。3. 熟练掌握MCI多媒体函数的应用。4. 编译时,菜单选中“项目”“设置”,要在库的链接中加入winmm.lib。/ V
17、ideo.cpp: implementation of the CVideo class./#include stdafx.h#include Video.h#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endif/ Construction/Destruction/CVideo:CVideo() / 初始化成员变量 m_bOpened = m_bPaused = m_bPlaying = FALSE; m_wDeviceID = 0;CVideo:CVideo() Close (
18、);BOOL CVideo:Open (CString Filename, CWnd *pWnd, int left, int top) if (!m_bOpened) / 初始化成员变量 m_bOpened = m_bPaused = m_bPlaying = FALSE; m_wDeviceID = 0; / 文件是否存在 CFileStatus Status; if (!CFile:GetStatus (Filename, Status) return FALSE; / 打开设备 MCI_DGV_OPEN_PARMS OpenParms; OpenParms.lpstrDeviceTyp
19、e = avivideo;/设置播放设备为视频播放设备 OpenParms.lpstrElementName = (LPSTR) Filename.GetBuffer (0); OpenParms.wDeviceID = 0; OpenParms.hWndParent = pWnd-m_hWnd;/将要播放视频文件的主窗口 OpenParms.dwStyle = WS_CHILD | WS_VISIBLE; if (mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE | MCI_OPEN_ELEMENT | MCI_DGV_OPEN
20、_PARENT | MCI_DGV_OPEN_WS, (DWORD)(LPVOID) &OpenParms) return FALSE; m_wDeviceID = OpenParms.wDeviceID; m_bOpened = TRUE; / 将文件长度设置为帧 MCI_DGV_SET_PARMS SetParms; SetParms.dwTimeFormat = MCI_FORMAT_FRAMES; if (mciSendCommand (m_wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &SetParms) Close
21、 (); return FALSE; / 找到视频文件的开始位置 mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL); /将播放画面置于主窗口之中 MCI_DGV_PUT_PARMS PutParms; PutParms.rc.left = left; PutParms.rc.top = top; PutParms.rc.right = GetWidth (); PutParms.rc.bottom = GetHeight (); if (mciSendCommand (m_wDeviceID, MCI_PUT, MC
22、I_WAIT | MCI_DGV_PUT_CLIENT | MCI_DGV_PUT_WINDOW | MCI_DGV_RECT, (DWORD)(LPVOID) &PutParms) Close (); return FALSE; return TRUE;void CVideo:Close (void) if (m_bOpened) / 停止播放并关闭设备 if (m_bPlaying | m_bPaused) mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL); mciSendCommand (m_wDeviceID, MCI_CLOSE,
23、NULL, NULL); / 清空成员变量 m_bOpened = m_bPaused = m_bPlaying = FALSE; m_wDeviceID = 0; /获得视频文件窗口的宽度int CVideo:GetWidth (void) if (m_bOpened) MCI_DGV_WHERE_PARMS WhereParms; if (mciSendCommand (m_wDeviceID, MCI_WHERE, MCI_DGV_WHERE_SOURCE, (DWORD)(LPVOID) &WhereParms) return 0; return (int) WhereParms.rc
24、.right; return 0;/获得视频文件窗口的高度int CVideo:GetHeight (void) if (m_bOpened) MCI_DGV_WHERE_PARMS WhereParms; if (mciSendCommand (m_wDeviceID, MCI_WHERE, MCI_DGV_WHERE_SOURCE, (DWORD)(LPVOID) &WhereParms) return 0; return (int) WhereParms.rc.bottom; return 0;BOOL CVideo:Play (BOOL bLoop, BOOL bFullScreen)
25、 if (m_bOpened) / 如果是视频的尾部则重新开始播放 if (GetFrame () = GetFrames () mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL); / 播放 MCI_DGV_PLAY_PARMS PlayParms; PlayParms.dwCallback = NULL; PlayParms.dwFrom = GetFrame (); DWORD dwFlags = MCI_FROM; if (bLoop) dwFlags |= MCI_DGV_PLAY_REPEAT; if (b
26、FullScreen) dwFlags |= MCI_MCIAVI_PLAY_FULLSCREEN; if (mciSendCommand (m_wDeviceID, MCI_PLAY, dwFlags, (DWORD)(LPVOID) &PlayParms) return FALSE; m_bPaused = FALSE; m_bPlaying = TRUE; return TRUE; return FALSE;void CVideo:Stop (void) if (m_bOpened & m_bPlaying) mciSendCommand (m_wDeviceID, MCI_STOP,
27、NULL, NULL); mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL); m_bPlaying = FALSE; m_bPaused = FALSE; void CVideo:Pause( void ) if (m_bOpened & m_bPlaying) MCI_DGV_PAUSE_PARMS PauseParms; if (mciSendCommand (m_wDeviceID, MCI_PAUSE, 0, (DWORD)(LPVOID) &PauseParms) return; m_bPaused = T
28、RUE; int CVideo:GetFrames (void) if (m_bOpened) MCI_DGV_STATUS_PARMS StatusParms; StatusParms.dwItem = MCI_STATUS_LENGTH; if (mciSendCommand (m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms) return 0; return (int) StatusParms.dwReturn; return 0;int CVideo:GetFrame (void) if (m_bOpened) MCI_DGV_STATUS_PARMS StatusParms; StatusParms.dwItem =
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1