多媒体编程音频视频实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南京工程学院
实验报告
课程名称多媒体编程基础
实验项目名称音频和视频
实验学生班级多媒体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; //记录波形设备ID
MCIDEVICEID m_ElementID; //记录波形元素ID
public:
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; //初始化设备ID
m_ElementID = 0; //初始化元素ID
InitDevice(); //调用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设置为0
return 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; //获取波形元素ID
MCI_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);
}
else
KillTimer(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类的包等,但是我通过和同学相互探讨、相互学习、相互监督,最终解决了问题。
本次实验实现文件的打开,进度条来显示视频播放的进度,音频播放器实现了暂停,继续,视频播放器,不仅可以播放视频,还可以播放音频文件,虽然使用了很多的接口,很多的函数已经封装好了,但是我在寻找这些和调试使用这些接口时候,还是花费了很多时间。
最后看结果,可能觉得简短了一点,但是在实现设计的过程中一点都不轻松,可以说还有一点的艰难,但虽然如此,依然让我感受颇深,收获颇多。
虽然是一个简单的音频,视频播放器的设计和实现,但是却使我对VC++有了更进一步的接触和了解,也让我对Windows Media Player控件有了新的认识和全面的了解。
教师评阅:。