实验8 数字视频播放器15修改汇总.docx
《实验8 数字视频播放器15修改汇总.docx》由会员分享,可在线阅读,更多相关《实验8 数字视频播放器15修改汇总.docx(21页珍藏版)》请在冰豆网上搜索。
实验8数字视频播放器15修改汇总
实验8数字视频播放器
实验目的:
1.进一步掌握MCI函数的应用。
2.制作数字视频播放器,并具有以下功能:
打开视频播放设备,播放视频文件,可静态观看每一帧视频,并且可设置播放速度,还能在全屏播放与正常播放之间转换。
实验步骤:
一如实验1建立应用程序框架
二制作应用程序界面
1.制作对话框
对话框控件属性表
控件
ID
标题
控件
ID
标题
pictrue
IDC_DISPLAY
Static
IDC_PLAY_SOUND
GroupBox
IDC_STATIC
视频信息
Static
IDC_FRAMES
Static
IDC_STATIC
视频文件名:
Static
IDC_DEMENSION
Static
IDC_STATIC
播放速度:
Button
IDC_OPEN
打开
Static
IDC_STATIC
是否静音:
Button
IDC_PLAY
播放
Static
IDC_STATIC
视频帧数:
Button
IDC_PAUSE
暂停
Static
IDC_STATIC
视频尺寸:
Button
IDC_PRE
上一帧
Static
IDC_VIDEO_NAME
Button
IDC_NEXT
下一帧
Static
IDC_PLAY_SPEED
Button
IDC_STOP
停止
现在在应用程序中插入一个对话框资源(插入—资源—对话框),用来设置播放速度,其ID设为IDD_SPEED:
IDD_SPEED对话框控件属性表
控件
ID
标题
EditBox
IDC_SPEED1
Button
IDOK
确定
Button
IDCANCEL
取消
还需象应用程序中插入一个对话框资源,用做视频输出窗口,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_PLAY
BN_CLICKED
IDC_STOP
BN_CLICKED
IDC_PAUSE
BN_CLICKED
IDC_PRE
BN_CLICKED
IDC_NEXT
BN_CLICKED
IDC_OPEN
BN_CLICKED
IDC_SPEED
COMMAND
IDC_FULLSCREEN
COMMAND
IDC_LOOP
COMMAND
IDC_SOUND
COMMAND
C***Dlg
WM_TIMER
然后为IDD_SPEED对话框资源添加一个intm_speed成员变量(选择IDD_SPEED对话框资源,右键选中建立类向导,新建类CSpeed,在该类中选中成员变量一项,选中IDC_SPEED1双击添加成员变量intm_speed)
三完成应用程序功能设计
1.将已设计好的类Cvideo加到你的工程中来(先把文件video.cpp和video.h拷贝到工程文件目录,在fileview中分别选择源文件和头文件目录,右键选择将文件添加到工程中,把这两个文件添加进工程目录中),并使C***Dlg的头文件包含该类的头文件(#include“video.h”;#include“speed.h”),然后在C***Dlg类的声明中加入以下代码:
protected:
CVideom_Video;
boolm_bIsOpen;
boolm_bSound;
boolm_bLoop;
boolm_bFullScreen;
CDialog*display;
2.初始化你的主对话框
在OnInitDlialog()中//TODO:
Addextrainitializationhere后加入以下代码:
display=newCDialog;
display->Create(IDD_DISPLAY);
SetTimer(1,100,NULL);
3.完成消息函数OnTimer,OnOpen,OnPlay,OnStop,OnPause,OnPre,OnNext,OnSound,OnLoop,OnFullScreen,OnSpeed
voidCVideoPlayerDlg:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CWnd*m_pWnd=GetDlgItem(IDC_PLAY);
m_pWnd->EnableWindow(m_bIsOpen);
m_pWnd=GetDlgItem(IDC_PAUSE);
m_pWnd->EnableWindow(m_bIsOpen);
m_pWnd=GetDlgItem(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)
{
CStringInfo;
Info.Format("当前播放帧数:
%d",m_Video.GetFrame());
m_pWnd=GetDlgItem(IDC_DISPLAY);//获得静态图像控件位置
CClientDCdc(m_pWnd);
CRectrect;
CBrushbrush(COLORREF(0)),*OldBrush;
OldBrush=(CBrush*)dc.SelectObject(brush);
m_pWnd->GetClientRect(rect);//获得静态图像控件大小
dc.SetTextColor(COLORREFRGB(0,0,255));
dc.SetBkColor(COLORREFRGB(0,0,0));
dc.FillRect(rect,&brush);
CSizesize=dc.GetTextExtent(Info);//获得文本尺寸
dc.TextOut((rect.Width()-size.cx)/2,(rect.Height()-size.cy)/2,Info);
dc.SelectObject(&OldBrush);
CStringstr;
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,str);
}
CDialog:
:
OnTimer(nIDEvent);
}
voidCVideoPlayerDlg:
:
OnOpen()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringFilter,str;
Filter="视频文件(*.AVI)|*.AVI||";
//得到窗口尺寸
CRectrect;
this->GetWindowRect(rect);
CFileDialogFileDlg(true,NULL,NULL,OFN_HIDEREADONLY,Filter);
if(FileDlg.DoModal()==IDOK)//单击文件选择对话框的“确定”键
{
if(!
m_Video.Open(FileDlg.GetPathName(),display,0,0))//打开视频文件
{
MessageBox("不能打开文件!
","Error",MB_OK|MB_ICONSTOP);
return;
}
//将显示屏幕定位在主对话框的下方,并根据视频大小确定屏幕大小
intBorder,Caption;
Border=GetSystemMetrics(SM_CXSIZEFRAME);
Caption=GetSystemMetrics(SM_CYCAPTION);
display->SetWindowPos(this,rect.left+30,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_DEMENSION,str);
m_bIsOpen=true;
}
}
voidCVideoPlayerDlg:
:
OnPlay()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_Video.Play(m_bLoop,m_bFullScreen);
}
voidCVideoPlayerDlg:
:
OnStop()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_Video.Stop();
}
voidCVideoPlayerDlg:
:
OnPause()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_Video.Pause();
}
voidCVideoPlayerDlg:
:
OnPre()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_Video.Backward
(1);
}
voidCVideoPlayerDlg:
:
OnNext()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_Video.Forward
(1);
}
voidCVideoPlayerDlg:
:
OnSound()
{
//TODO:
Addyourcommandhandlercodehere
m_bSound=!
m_bSound;
m_Video.SetSound(m_bSound);
}
voidCVideoPlayerDlg:
:
OnSpeed()
{
//TODO:
Addyourcommandhandlercodehere
CSpeeddlg;
dlg.m_speed=m_Video.GetSpeed();
if(dlg.DoModal()==IDOK)
m_Video.SetSpeed(dlg.m_speed);
}
voidCVideoPlayerDlg:
:
OnFullscreen()
{
//TODO:
Addyourcommandhandlercodehere
m_bFullScreen=!
m_bFullScreen;
}
voidCVideoPlayerDlg:
:
OnLoop()
{
//TODO:
Addyourcommandhandlercodehere
m_bLoop=!
m_bLoop;
}
现在编译执行,视频播放器变完成了。
实验注意事项:
1.调试程序时,Ctrl+F7为Compile,Build为F7,运行时按F5。
2.注意可重用类CVideo的设计。
3.熟练掌握MCI多媒体函数的应用。
4.编译时,菜单选中“项目”“设置”,要在库的链接中加入winmm.lib。
//Video.cpp:
implementationoftheCVideoclass.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"Video.h"
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////
CVideo:
:
CVideo()
{
//初始化成员变量
m_bOpened=m_bPaused=m_bPlaying=FALSE;
m_wDeviceID=0;
}
CVideo:
:
~CVideo()
{
Close();
}
BOOLCVideo:
:
Open(CStringFilename,CWnd*pWnd,intleft,inttop)
{
if(!
m_bOpened){
//初始化成员变量
m_bOpened=m_bPaused=m_bPlaying=FALSE;
m_wDeviceID=0;
//文件是否存在
CFileStatusStatus;
if(!
CFile:
:
GetStatus(Filename,Status))
returnFALSE;
//打开设备
MCI_DGV_OPEN_PARMSOpenParms;
OpenParms.lpstrDeviceType="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_PARENT|MCI_DGV_OPEN_WS,(DWORD)(LPVOID)&OpenParms))
returnFALSE;
m_wDeviceID=OpenParms.wDeviceID;
m_bOpened=TRUE;
//将文件长度设置为帧
MCI_DGV_SET_PARMSSetParms;
SetParms.dwTimeFormat=MCI_FORMAT_FRAMES;
if(mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&SetParms)){
Close();
returnFALSE;
}
//找到视频文件的开始位置
mciSendCommand(m_wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,NULL);
//将播放画面置于主窗口之中
MCI_DGV_PUT_PARMSPutParms;
PutParms.rc.left=left;
PutParms.rc.top=top;
PutParms.rc.right=GetWidth();
PutParms.rc.bottom=GetHeight();
if(mciSendCommand(m_wDeviceID,MCI_PUT,MCI_WAIT|MCI_DGV_PUT_CLIENT|MCI_DGV_PUT_WINDOW|MCI_DGV_RECT,(DWORD)(LPVOID)&PutParms)){
Close();
returnFALSE;
}
}
returnTRUE;
}
voidCVideo:
:
Close(void)
{
if(m_bOpened){
//停止播放并关闭设备
if(m_bPlaying||m_bPaused)
mciSendCommand(m_wDeviceID,MCI_STOP,NULL,NULL);
mciSendCommand(m_wDeviceID,MCI_CLOSE,NULL,NULL);
//清空成员变量
m_bOpened=m_bPaused=m_bPlaying=FALSE;
m_wDeviceID=0;
}
}
//获得视频文件窗口的宽度
intCVideo:
:
GetWidth(void)
{
if(m_bOpened){
MCI_DGV_WHERE_PARMSWhereParms;
if(mciSendCommand(m_wDeviceID,MCI_WHERE,MCI_DGV_WHERE_SOURCE,(DWORD)(LPVOID)&WhereParms)){
return0;
}
return(int)WhereParms.rc.right;
}
return0;
}
//获得视频文件窗口的高度
intCVideo:
:
GetHeight(void)
{
if(m_bOpened){
MCI_DGV_WHERE_PARMSWhereParms;
if(mciSendCommand(m_wDeviceID,MCI_WHERE,MCI_DGV_WHERE_SOURCE,(DWORD)(LPVOID)&WhereParms)){
return0;
}
return(int)WhereParms.rc.bottom;
}
return0;
}
BOOLCVideo:
:
Play(BOOLbLoop,BOOLbFullScreen)
{
if(m_bOpened){
//如果是视频的尾部则重新开始播放
if(GetFrame()>=GetFrames())
mciSendCommand(m_wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,NULL);
//播放
MCI_DGV_PLAY_PARMSPlayParms;
PlayParms.dwCallback=NULL;
PlayParms.dwFrom=GetFrame();
DWORDdwFlags=MCI_FROM;
if(bLoop)
dwFlags|=MCI_DGV_PLAY_REPEAT;
if(bFullScreen)
dwFlags|=MCI_MCIAVI_PLAY_FULLSCREEN;
if(mciSendCommand(m_wDeviceID,MCI_PLAY,dwFlags,(DWORD)(LPVOID)&PlayParms))
returnFALSE;
m_bPaused=FALSE;
m_bPlaying=TRUE;
returnTRUE;
}
returnFALSE;
}
voidCVideo:
:
Stop(void)
{
if(m_bOpened&&m_bPlaying){
mciSendCommand(m_wDeviceID,MCI_STOP,NULL,NULL);
mciSendCommand(m_wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,NULL);
m_bPlaying=FALSE;
m_bPaused=FALSE;
}
}
voidCVideo:
:
Pause(void)
{
if(m_bOpened&&m_bPlaying){
MCI_DGV_PAUSE_PARMSPauseParms;
if(mciSendCommand(m_wDeviceID,MCI_PAUSE,0,(DWORD)(LPVOID)&PauseParms))
return;
m_bPaused=TRUE;
}
}
intCVideo:
:
GetFrames(void)
{
if(m_bOpened){
MCI_DGV_STATUS_PARMSStatusParms;
StatusParms.dwItem=MCI_STATUS_LENGTH;
if(mciSendCommand(m_wDeviceID,MCI_STATUS,MCI_