实验3 数字视频播放器.docx

上传人:b****8 文档编号:9524622 上传时间:2023-02-05 格式:DOCX 页数:21 大小:26.81KB
下载 相关 举报
实验3 数字视频播放器.docx_第1页
第1页 / 共21页
实验3 数字视频播放器.docx_第2页
第2页 / 共21页
实验3 数字视频播放器.docx_第3页
第3页 / 共21页
实验3 数字视频播放器.docx_第4页
第4页 / 共21页
实验3 数字视频播放器.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

实验3 数字视频播放器.docx

《实验3 数字视频播放器.docx》由会员分享,可在线阅读,更多相关《实验3 数字视频播放器.docx(21页珍藏版)》请在冰豆网上搜索。

实验3 数字视频播放器.docx

实验3数字视频播放器

实验2数字视频播放器

实验目的:

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成员变量

三完成应用程序功能设计

1.将已设计好的类Cvideo加到你的工程中来,并使C***Dlg的头文件包含该类的头文件,然后在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_WAIT|MCI_STATUS_ITEM,(DWORD)(LPVOID)&StatusParms))

return0;

return(int)StatusParms.dwReturn;

}

return0;

}

intCVideo:

:

GetFrame(void)

{

if(m_bOpened){

MCI_DGV_STATUS_PARMSStatusParms;

StatusParms.dwItem=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 艺术创意

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1