




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
多媒體實(shí)驗(yàn)報(bào)告一姓名:方子乙 學(xué)號(hào):201100300336班級(jí):2011級(jí)軟件6班
一、實(shí)驗(yàn)?zāi)康?、熟悉和掌握使用WindowsMCI進(jìn)行編程的基本原理和方法。2、熟悉各種不同的音頻文件格式。3、了解音頻壓縮的實(shí)現(xiàn)方法。二、實(shí)驗(yàn)內(nèi)容 使用WindowsAPI和一種高級(jí)語(yǔ)言,編程實(shí)現(xiàn)類似于Windows錄音機(jī)一類的小工具,要求能播放wav文件、mid文件,并實(shí)現(xiàn)打開、播放、暫停、停止、錄音、保存(快進(jìn)、快退)等功能。 更高要求:能實(shí)現(xiàn)壓縮錄音三、實(shí)驗(yàn)環(huán)境硬件:耳機(jī)麥克風(fēng)軟件:VisualC++6.0(或VisualBasic,Java),WindowsMCI四、實(shí)驗(yàn)步驟1、創(chuàng)建一個(gè)基于對(duì)話框的工程,如play。2、在對(duì)話框上添加相應(yīng)的按鈕,實(shí)現(xiàn)如錄音、存盤、打開文件、暫停、播放、停止、前進(jìn)、后退等項(xiàng)功能。可考慮添加滑動(dòng)條(slider控件)用來反映目前的播放位置,等等。3、為各個(gè)按鈕添加相應(yīng)的函數(shù)。4、調(diào)試,運(yùn)行。五、主要代碼//playDlg.cpp:implementationfile//#include"stdafx.h"#include"play.h"#include"playDlg.h"#include"MMSYSTEM.H"#include<iostream>#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CPlayDlgdialogCPlayDlg::CPlayDlg(CWnd*pParent/*=NULL*/) :CDialog(CPlayDlg::IDD,pParent){ //{{AFX_DATA_INIT(CPlayDlg) //NOTE:theClassWizardwilladdmemberinitializationhere //}}AFX_DATA_INIT //NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32 m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCPlayDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPlayDlg) //NOTE:theClassWizardwilladdDDXandDDVcallshere //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CPlayDlg,CDialog) //{{AFX_MSG_MAP(CPlayDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_STOP,OnButtonStop) ON_BN_CLICKED(IDC_BUTTON_BACK,OnButtonBack) ON_BN_CLICKED(IDC_BUTTON_FORWARD,OnButtonForward) ON_BN_CLICKED(IDC_BUTTON_OPEN,OnButtonOpen) ON_BN_CLICKED(IDC_BUTTON_SAVE,OnButtonSave) ON_BN_CLICKED(IDC_BUTTON_PLAYORPAUSE,OnButtonPlayorpause) ON_BN_CLICKED(IDC_BUTTON_RECORDORPAUSE,OnButtonRecordorpause) //}}AFX_MSG_MAP ON_MESSAGE(MM_MCINOTIFY,MciNotify)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CPlayDlgmessagehandlersBOOLCPlayDlg::OnInitDialog(){ CDialog::OnInitDialog(); //Settheiconforthisdialog.Theframeworkdoesthisautomatically //whentheapplication'smainwindowisnotadialog SetIcon(m_hIcon,TRUE); //Setbigicon SetIcon(m_hIcon,FALSE); //Setsmallicon //TODO:Addextrainitializationhere m_Ready=FALSE; m_PSign=FALSE; //初始化正在播放標(biāo)識(shí) m_ASign=FALSE; //初始化正在暫停標(biāo)識(shí) m_MCIDeviceID=0; //初始化設(shè)備標(biāo)識(shí) returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,//thisisautomaticallydoneforyoubytheframework.voidCPlayDlg::OnPaint(){ if(IsIconic()) { CPaintDCdc(this);//devicecontextforpainting SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0); //Centericoninclientrectangle intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //Drawtheicon dc.DrawIcon(x,y,m_hIcon); } else { CDialog::OnPaint(); }}//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags//theminimizedwindow.HCURSORCPlayDlg::OnQueryDragIcon(){ return(HCURSOR)m_hIcon;}//添加的Notify消息處理LRESULTCPlayDlg::MciNotify(WPARAMwParam,LPARAMlParam){ if(wParam==MCI_NOTIFY_SUCCESSFUL)//成功播放完成后重置標(biāo)識(shí) { m_Ready=TRUE; m_PSign=FALSE;//設(shè)置正在播放標(biāo)識(shí)為FALSE m_ASign=FALSE;//設(shè)置正在暫停標(biāo)識(shí)為FALSE mciSendCommand(m_MCIDeviceID,MCI_SEEK,MCI_SEEK_TO_START|MCI_WAIT,NULL); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(false); SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"播放"); return0; } return-1;//否則返回錯(cuò)誤}voidCPlayDlg::OnButtonPlayorpause(){ //TODO:Addyourcontrolnotificationhandlercodehere if(m_Ready){//文件準(zhǔn)備好 if(!m_PSign)//沒有音樂播放時(shí) OnButtonPlay(); else //有音樂播放 PauseOrContinue(); GetDlgItem(IDC_BUTTON_BACK)->EnableWindow(true); GetDlgItem(IDC_BUTTON_FORWARD)->EnableWindow(true); } else MessageBox("音樂文件沒準(zhǔn)備好?。。?);}voidCPlayDlg::OnButtonPlay(){ //TODO:Addyourcontrolnotificationhandlercodehere MCI_OPEN_PARMSmciplay; mciplay.dwCallback=(long)GetSafeHwnd(); dwError=mciSendCommand(m_MCIDeviceID,MCI_SEEK,MCI_SEEK_TO_START,NULL); if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,80)) MessageBox(szErrorBuf,"MCI出錯(cuò)",MB_ICONWARNING); else MessageBox("不明錯(cuò)誤標(biāo)識(shí)","MCI出錯(cuò)",MB_ICONWARNING); return; } dwError=mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&mciplay); if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,80)) MessageBox(szErrorBuf,"MCI出錯(cuò)",MB_ICONWARNING); else MessageBox("不明錯(cuò)誤標(biāo)識(shí)","MCI出錯(cuò)",MB_ICONWARNING); return; } m_PSign=true;//設(shè)置正在播放標(biāo)識(shí)為TRUE m_ASign=false; SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"暫停"); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(true); MCI_STATUS_PARMSstatusParms; statusParms.dwItem=MCI_STATUS_LENGTH; mciSendCommand(m_MCIDeviceID, MCI_STATUS, MCI_STATUS_ITEM|MCI_WAIT, (DWORD)(LPVOID)&statusParms ); dwLength=statusParms.dwReturn;}voidCPlayDlg::OnButtonStop(){ //停止播放 dwError=mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL); if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出錯(cuò)",MB_ICONWARNING); else MessageBox("不明錯(cuò)誤標(biāo)識(shí)","MCI出錯(cuò)",MB_ICONWARNING); return; } mciSendCommand(m_MCIDeviceID,MCI_SEEK,MCI_SEEK_TO_START|MCI_WAIT,NULL); m_PSign=FALSE; //設(shè)置正在播放標(biāo)識(shí)為FALSE m_ASign=FALSE; //設(shè)置正在暫停標(biāo)識(shí)為FALSE GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(false); GetDlgItem(IDC_BUTTON_BACK)->EnableWindow(false); GetDlgItem(IDC_BUTTON_FORWARD)->EnableWindow(false); SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"播放");}voidCPlayDlg::OnButtonBack(){ //TODO:Addyourcontrolnotificationhandlercodehere MCI_STATUS_PARMSstatusParms; MCI_PLAY_PARMSplayParms; statusParms.dwItem=MCI_STATUS_POSITION; mciSendCommand(m_MCIDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&statusParms );dwCurrentPos=statusParms.dwReturn; if(dwCurrentPos<=(dwLength/10)){mciSendCommand(m_MCIDeviceID,MCI_SEEK,MCI_SEEK_TO_END,NULL);mciSendCommand(m_MCIDeviceID,MCI_PLAY,0,(DWORD)(LPVOID)&playParms);}else{ playParms.dwFrom=dwCurrentPos-(DWORD)(dwLength/10);mciSendCommand(m_MCIDeviceID, MCI_PLAY, MCI_FROM, (DWORD)(LPVOID)&playParms); }}voidCPlayDlg::OnButtonForward(){ //TODO:Addyourcontrolnotificationhandlercodehere if(m_PSign){//只有又文件播放時(shí)時(shí)才可以快進(jìn),跳轉(zhuǎn)到文件末尾 MCI_STATUS_PARMSstatusParms; MCI_PLAY_PARMSplayParms; statusParms.dwItem=MCI_STATUS_POSITION; mciSendCommand(m_MCIDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&statusParms );dwCurrentPos=statusParms.dwReturn; if((dwLength-dwCurrentPos)<=(dwLength/10)){mciSendCommand(m_MCIDeviceID,MCI_SEEK,MCI_SEEK_TO_END,NULL);mciSendCommand(m_MCIDeviceID,MCI_PLAY,0,(DWORD)(LPVOID)&playParms);}else{ playParms.dwFrom=dwCurrentPos+(DWORD)(dwLength/10);mciSendCommand(m_MCIDeviceID, MCI_PLAY, MCI_FROM, (DWORD)(LPVOID)&playParms); } }}voidCPlayDlg::OnButtonOpen()//僅僅打開文件,得到文件的基本信息{ //TODO:Addyourcontrolnotificationhandlercodehere staticcharszFilter[]="波形音頻文件(*.wav)|*.wav|MIDI序列(*.mid)|*.mid||"; CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter); if(dlg.DoModal()==IDOK) { fileext=dlg.GetFileExt(); //獲取打開的文件擴(kuò)展名 m_strBBSFilePath=dlg.GetPathName(); if(m_PSign) //如果程序正在播放,則關(guān)閉 { dwError=mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL);//關(guān)閉文件 if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出錯(cuò)",MB_ICONWARNING); else MessageBox("不明錯(cuò)誤標(biāo)識(shí)","MCI出錯(cuò)",MB_ICONWARNING); return; } dwError=mciSendCommand(m_MCIDeviceID,MCI_CLOSE,0,NULL);//關(guān)閉正在播放的聲音 if(dwError) //如果關(guān)閉不成功,則顯示出錯(cuò)的原因 { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出錯(cuò)",MB_ICONWARNING); else MessageBox("不明錯(cuò)誤標(biāo)識(shí)","MCI出錯(cuò)",MB_ICONWARNING);//給出相應(yīng)報(bào)告 return; } SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"播放"); } MCI_OPEN_PARMSmciOpenParms;//定義結(jié)構(gòu)體變量用來存儲(chǔ)打開文件的信息和返回的設(shè)備標(biāo)識(shí)信息 //沒有聲音正在播放,則獲取打開文件的后輟,并根據(jù)后輟決定相應(yīng)的打開類型 if(!strcmp("wav",fileext)) //當(dāng)后輟為wav時(shí) mciOpenParms.lpstrDeviceType="waveaudio"; elseif(!strcmp("mid",fileext))//當(dāng)后輟為mid時(shí) mciOpenParms.lpstrDeviceType="sequencer"; mciOpenParms.lpstrElementName=m_strBBSFilePath.GetBuffer(m_strBBSFilePath.GetLength()); //將打開的文件名存入mciOpenParms結(jié)構(gòu)體中 dwError=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms); //發(fā)送打開文件命令,MCI_OPEN_TYPE參數(shù)說明設(shè)備類型名包含在mciOpenParms結(jié)構(gòu)體中, //MCI_OPEN_ELEMENT參數(shù)說明要打開的文件名包含在mciOpenParams結(jié)構(gòu)體中 if(dwError)//如果打開不成功,則顯示出錯(cuò)的原因 { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出錯(cuò)",MB_ICONWARNING); else MessageBox("不明錯(cuò)誤標(biāo)識(shí)","MCI出錯(cuò)",MB_ICONWARNING); return; } m_MCIDeviceID=mciOpenParms.wDeviceID;//將獲取的設(shè)備ID值賦給全局變量m_MCIDeviceID m_Ready=TRUE;//文件已準(zhǔn)備好 m_PSign=FALSE;//設(shè)置正在播放標(biāo)識(shí)為FALSE m_ASign=FALSE;//設(shè)置正在暫停標(biāo)識(shí)為FALSE GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(false); GetDlgItem(IDC_BUTTON_PLAYORPAUSE)->EnableWindow(true); //GetDlgItem(IDC_BUTTON_BACK)->EnableWindow(false); //GetDlgItem(IDC_BUTTON_FORWARD)->EnableWindow(false); GetDlgItem(IDC_BUTTON_RECORDORPAUSE)->EnableWindow(true); SetDlgItemText(IDC_EDIT1,m_strBBSFilePath); }}voidCPlayDlg::OnButtonSave(){ //TODO:Addyourcontrolnotificationhandlercodehere CFileDialogdlg(FALSE,NULL,NULL,OFN_ALLOWMULTISELECT,_T("TextFiles(*.txt)|*.txt|AllFiles(*.*)|*.*||"),AfxGetMainWnd()); if(dlg.DoModal()==IDOK) { CStringm_strBBSFilePath=dlg.GetPathName(); SetDlgItemText(IDC_EDIT1,m_strBBSFilePath); } //保存功能要自己寫————這里只得到保存的路徑}voidCPlayDlg::PauseOrContinue(){ //TODO:Addyourcontrolnotificationhandlercodehere if(!m_ASign)//音樂正在播放時(shí) { dwError=mciSendCommand(m_MCIDeviceID,MCI_PAUSE,0,NULL); //則暫停播放 if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出錯(cuò)",MB_ICONWARNING); else MessageBox("不明錯(cuò)誤標(biāo)識(shí)","MCI出錯(cuò)",MB_ICONWARNING); return; } m_ASign=TRUE; //設(shè)置正在暫停標(biāo)識(shí)為TRUE SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"播放"); } else//音樂暫停時(shí) { dwError=mciSendCommand(m_MCIDeviceID,MCI_RESUME,0,NULL); //則繼續(xù)播放 if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出錯(cuò)",MB_ICONWARNING); else MessageBox("不明錯(cuò)誤標(biāo)識(shí)","MCI出錯(cuò)",MB_ICONWARNING); return; } m_ASign=FALSE; //設(shè)置正在暫停標(biāo)識(shí)為false SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"暫停"); }}voidCPlayDlg::OnButtonRecordorpause(){ //TODO:Addyourcontrolnotificationhandlercodehere GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(false); GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(false); GetDlgItem(IDC_BUTTON_PLAYORPAUSE)->EnableWindow(false); GetDlgItem(IDC_BUTTON_BACK)->EnableWindow(false); GetDlgItem(IDC_BUTTON_FORWARD)->EnableWindow(false); GetDlgItem(IDC_BUTTON_RECORDORPAUSE)->EnableWindow(false); if(m_PSign) //如果程序正在播放,則關(guān)閉 { dwError=mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL);//關(guān)閉文件 if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出錯(cuò)",MB_ICONWARNING); else MessageBox("不明錯(cuò)誤標(biāo)識(shí)","MCI出錯(cuò)",MB_ICONWARNING); return; } dwError=mciSendCommand(m_MCIDeviceID,MCI_CLOSE,0,NULL);//關(guān)閉正在播放的聲音 if(dwError) //如果關(guān)閉不成功,則顯示出錯(cuò)的原因 { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出錯(cuò)",MB_ICONWARNING); else MessageBox("不明錯(cuò)誤標(biāo)識(shí)","MCI出錯(cuò)",MB_ICONWARNING);//給出相應(yīng)報(bào)告 return; } SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"播放"); } m_PSign=FALSE; m_ASign=FALSE; MCI_OPEN_PARMSmciOpenParms; MCI_RECORD_PARMSmciRecordParms; MCI_SAVE_PARMSmciSaveParms; MCI_PLAY_PARMSmciPlayParms; //用新文件打開波形聲音,以進(jìn)行錄音 mciOpenParms.lpstrDeviceType="waveaudio"; mciOpenParms.lpstrElementName=""; if(dwError=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_OPEN_TYPE,(DWORD)(LPVOID)&mciOpenParms)) { //打開設(shè)備失敗,返回錯(cuò)誤碼 return; } //打開設(shè)備成功,獲取設(shè)備ID m_MCIDeviceID=mciOpenParms.wDeviceID; //按指定的時(shí)間(ms)長(zhǎng)度開始錄音,等待錄音結(jié)束再繼續(xù)執(zhí)行程序 //設(shè)備的時(shí)間格式應(yīng)設(shè)為ms mciRecordParms.dwTo=(DWORD)5*1000; if(dwError=mciSendCommand(m_MCIDeviceID,MCI_RECORD,MCI_TO|MCI_WAIT,(DWORD)(LPVOID)&mciRecordParms)) { mciSendCommand(m_MCIDeviceID,MCI_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年危險(xiǎn)人格的測(cè)試題及答案
- 2025年多彩面試筆試試題及答案
- 2025年婦嬰科面試題及答案
- 2025年生藥學(xué)章試題及答案
- 2025年童年填空測(cè)試題及答案
- 2025年融媒體直播測(cè)試題及答案
- 2025年英語(yǔ)中考試題及答案云南
- 2025年藥學(xué)人員培訓(xùn)試題及答案
- 2025年婦產(chǎn)科中級(jí)考試題及答案
- 2025年安陽(yáng)數(shù)學(xué)二模試題及答案
- 三菱 PLC FX2N-4AD 4DA 模擬量模塊教材(課堂PPT)
- 有機(jī)金屬化學(xué)1
- JIT標(biāo)準(zhǔn)作業(yè)作業(yè)指導(dǎo)書
- 土壤固化土施工技術(shù)導(dǎo)則
- VAR模型Johansen協(xié)整檢驗(yàn)在eviews中的具體操作步驟及結(jié)果解釋
- 混凝土面板堆石壩接縫止水
- 加油站法律法規(guī)符合性評(píng)價(jià)
- 5外科--丹毒下肢丹毒中醫(yī)診療方案2017年版
- 錨索錨桿計(jì)算表格(含下滑力及錨桿錨索受力及伸長(zhǎng)值計(jì)算)
- 數(shù)學(xué)物理方法第十一章PPT課件
- (完整版)漢字偏旁部首名稱表最新(精華版)
評(píng)論
0/150
提交評(píng)論