当前位置:文档之家› 多媒体编程音频视频实验报告

多媒体编程音频视频实验报告

南京工程学院实验报告课程名称多媒体编程基础实验项目名称音频和视频实验学生班级多媒体132 实验学生姓名滕超学号 202130229 同组学生姓名无实验时间 2016 年 5 月 26 日实验地点信息楼A213实验5 音频/视频处理一、实验目的:1.理解Windows系统中音频、视频处理的方法。

2.理解MCI接口的概念。

3.了解音视频处理技巧,以及实际应用方法4.掌握实现音频播放器和视频播放器的常用方法。

二、实验环境及开发工具:PC机、Windows 8.1操作系统、Visual C++ 2013三、实验要求及内容:1)理解第9章教材例题及上课所讲的参考例程。

2)运用学过的知识,在理解例题的基础上自己编写一个多媒体播放器应用程序,包括:一个音频(MP3、wma)播放器和一个视频播放器处理(avi、wmv、asf)程序,要求具有以下功能:可以播放本机中的音视频媒体文件文件;音频播放参照课堂提供的例子, 必须创建一个播放类来实现视频播放可以直接使用WMP控件,适当添加针对文件的操作功能。

音频设计流程图:音频界面设计如下:使用CPlayWave类/*PlayWave.h*/#pragma once#include "mmsystem.h"class CPlayWave{//定义保护保护成员protected:MCIDEVICEID m_DeviceID; //记录波形设备IDMCIDEVICEID m_ElementID; //记录波形元素IDpublic:CPlayWave(void);~CPlayWave(void);DWORD InitDevice(void);DWORD TeminalDevice(void);DWORD Play(HWND hWnd, LPCWSTR pFileName);DWORD Stop(void);DWORD Pause();DWORD Resume();};/*PlayWave.cpp*/#include "StdAfx.h"#include "PlayWave.h"CPlayWave::CPlayWave(void){m_DeviceID = 0; //初始化设备IDm_ElementID = 0; //初始化元素IDInitDevice(); //调用InitDevice方法初始化设}CPlayWave::~CPlayWave(void){if (m_ElementID) //判断波形元素是否为0 Stop(); //停止波形元素if (m_DeviceID) //判断波形设备是否为0 TeminalDevice(); //停止波形设备}DWORD CPlayWave::InitDevice(void){DWORD dwResult = 0; //定义一个整型变量if (m_DeviceID == 0) //如果设备ID为0{MCI_OPEN_PARMS mciInitParms; //定义打开参数mciInitParms.lpstrDeviceType =(LPWSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;dwResult = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE |MCI_OPEN_TYPE_ID| MCI_WAIT, (DWORD)(LPVOID)&mciInitParms); //打开波形设备m_DeviceID = mciInitParms.wDeviceID;}return dwResult;}DWORD CPlayWave::TeminalDevice(void){DWORD dwResult = 0; //定义一个整型变量if (m_DeviceID) //判断设备ID是否为0{//关闭波形设备dwResult = mciSendCommand(m_DeviceID, MCI_CLOSE, NULL, NULL);}m_DeviceID = 0; //将波形设备ID设置为0return dwResult;}DWORD CPlayWave::Play(HWND hWnd, LPCWSTR pFileName){MCI_OPEN_PARMS mciOpenParms; //定义打开参数memset(&mciOpenParms, 0, sizeof(MCI_OPEN_PARMS)); //初始化参数mciOpenParms.lpstrElementName = pFileName; //设置文件名DWORD dwResult = 0; //定义整型变量dwResult = mciSendCommand(m_DeviceID, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&mciOpenParms); //打开波形元素if (!dwResult){m_ElementID = mciOpenParms.wDeviceID; //获取波形元素IDMCI_PLAY_PARMS mciPlayParms; //定义播放参数mciPlayParms.dwCallback = (DWORD)hWnd; //设置播放参数dwResult = mciSendCommand(m_ElementID, MCI_PLAY,MCI_NOTIFY, (DWORD)(LPVOID)&mciPlayParms); //播放wav文件}return dwResult;}DWORD CPlayWave::Stop(void){DWORD dwResult = 0; //定义一个整型变量if (m_ElementID) //判断波形元素ID是否为0{//关闭波形元素dwResult = mciSendCommand(m_ElementID, MCI_CLOSE, NULL, NULL);m_ElementID = 0; //设置波形元素ID为0}return dwResult;}DWORD CPlayWave::Pause(){mciSendCommand(m_ElementID, MCI_PAUSE, 0, NULL);return 0;}DWORD CPlayWave::Resume(){mciSendCommand(m_ElementID, MCI_RESUME, 0, NULL);return 0;}/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/“添加”按钮的事件处理void CMusicDlg::OnBnClickedAddlist(){// TODO: 在此添加控件通知处理程序代码//m_List.ResetContent(); //清空列表CFileDialog flDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT| OFN_ALLOWMULTISELECT, L"音频文件|*.wav;*.mp3;*.wma||", this);//定义一个问价打开对话框if (flDlg.DoModal() == IDOK) //判断用户是否按OK按钮{POSITION pos = flDlg.GetStartPosition(); //获取文件名列表的首位置while (pos != NULL) //利用循环遍历文件名列表{m_List.AddString(flDlg.GetNextPathName(pos)); //将文件名添加的列表框控件中}}}“播放”按钮添加事件处理void CMusicDlg::OnLbnDblclkList1(){// TODO: 在此添加控件通知处理程序代码int selIndex = m_List.GetCurSel(); //获取当前选择的列表项索引if (selIndex != LB_ERR) //判断是否有项目被选中{//定义一个字符串对象CString str;//根据索引获取当前项目的字符串m_List.GetText(selIndex, str);//停止播放wave.Stop();wave.TeminalDevice();//开始播放歌曲wave.Play(m_hWnd, str);}}双击列表框播放音乐void CMusicDlg::OnLbnDblclkList1(){// TODO: 在此添加控件通知处理程序代码int selIndex = m_List.GetCurSel(); //获取当前选择的列表项索引if (selIndex != LB_ERR) //判断是否有项目被选中{//定义一个字符串对象CString str;//根据索引获取当前项目的字符串m_List.GetText(selIndex, str);//停止播放wave.Stop();wave.TeminalDevice();//开始播放歌曲wave.Play(m_hWnd, str);}}“暂停”和“继续”事件处理void CMusicDlg::OnBnClickedBstopPlay(){wave.Pause();is_stop = !is_stop;GetDlgItem(IDC_BSTOP_PLAY)->SetWindowText(L"继续");if (is_stop){wave.Resume();GetDlgItem(IDC_BSTOP_PLAY)->SetWindowText(L"暂停");}}视频播放器设计流程图:定义变量:CWMPPlayer4 m_play;CWMPControls m_mediacontrol; //控制按钮关联CWMPSettings m_mediasetting; //设置按钮关联CWMPMedia m_media; //媒体CProgressCtrl *m_progress; //进度条“打开”按钮事件处理void CVideoPlayer::OnBnClickedVideoopen(){ CString filename;CFileDialog dlg(TRUE, NULL, L"*.*", OFN_FILEMUSTEXIST, L"串流多媒体(*.asf) | *.asf |"L"音频视频交错格式(*.avi) | *.avi |"L"即时播音系统(*.rm) | *.rm |"L"波音音频设备(*.wav) | *.wav |"L"所有文件(*.*) | *.* ||");if (IDOK == dlg.DoModal()){filename = dlg.GetPathName();m_play.put_URL(filename); // 播放}m_media = static_cast<CWMPMedia>(m_play.newMedia(filename));m_progress->SetRange(0, (int)m_media.get_duration()); //媒体总长度m_progress->SetPos(0);}“播放”按钮事件处理void CVideoPlayer::OnBnClickedVideoplay(){m_mediacontrol.play();}“暂停”按钮事件处理void CVideoPlayer::OnBnClickedVideosuspend(){m_mediacontrol.pause();}“停止”按钮事件处理void CVideoPlayer::OnBnClickedVideostop(){m_mediacontrol.stop();}“全屏”按钮事件处理void CVideoPlayer::OnBnClickedfullscreen(){m_play.put_fullScreen(TRUE);}“音量-”按钮事件处理void CVideoPlayer::OnBnClickedVideol(){m_mediasetting.put_volume(m_mediasetting.get_volume() - 10);}“音量+”按钮事件处理void CVideoPlayer::OnBnClickedVideor(){m_mediasetting.put_volume(m_mediasetting.get_volume() + 10);}“进度条”控件处理void CVideoPlayer::PlayStateChangeOcx1(long NewState){if (NewState == 3) //播放状态时, 开启定时器SetTimer(1, 1000, NULL);else if (NewState == 1) //停止时, 关闭定时器, 进度条回0{KillTimer(1);}elseKillTimer(1);}void CVideoPlayer::OnTimer(UINT_PTR nIDEvent){if (nIDEvent != 1)return;m_progress->SetPos(m_progress->GetPos() + 1);CDialogEx::OnTimer(nIDEvent);}“快进”按钮事件处理void CVideoPlayer::OnBnClickedBtnfront(){m_mediacontrol.fastForward(); //快进}“快退”按钮事件处理void CVideoPlayer::OnBnClickedBtnback(){m_mediacontrol.fastReverse(); //快退}四、运行结果音频播放器:点击“添加”按钮,添加”.mp3”文件,可以双击播放,也可以单击播放按钮播放点击“暂停”按钮后,音乐暂停播放,按钮名称变成“继续”,再点击“继续”音乐继续播放视频播放器:单击“打开”按钮,添加播放文件点击“全屏”或者双击视频可以达到全屏效果五、实验总结在实验的过程中不仅检验了我所学习的知识,也让我知道如何去扩展的学习更多的知识,在实验的过程中,我遇到了很多的问题,比如不知道如何导CWMPMedia类的包等,但是我通过和同学相互探讨、相互学习、相互监督,最终解决了问题。

相关主题