VB课设MP3设计报告.docx

上传人:b****8 文档编号:9327639 上传时间:2023-02-04 格式:DOCX 页数:55 大小:311.88KB
下载 相关 举报
VB课设MP3设计报告.docx_第1页
第1页 / 共55页
VB课设MP3设计报告.docx_第2页
第2页 / 共55页
VB课设MP3设计报告.docx_第3页
第3页 / 共55页
VB课设MP3设计报告.docx_第4页
第4页 / 共55页
VB课设MP3设计报告.docx_第5页
第5页 / 共55页
点击查看更多>>
下载资源
资源描述

VB课设MP3设计报告.docx

《VB课设MP3设计报告.docx》由会员分享,可在线阅读,更多相关《VB课设MP3设计报告.docx(55页珍藏版)》请在冰豆网上搜索。

VB课设MP3设计报告.docx

VB课设MP3设计报告

 

福建工程学院

VB课程设计

 

课题:

具有记忆功能的MP3播放器

班级:

电气1102

学号:

姓名:

同组组员:

指导老师:

黄旭红、;林挺钊、林丽

日期:

2014.5.30

 

一、设计的目的与要求

 MP3播放器为多媒体播放器中的一大类,各类可在window上运行的MP3播放器软件也很多。

试开发一个具有记忆功能的MP3播放器软件,要求如下:

1.菜单式的人机界面。

2.该MP3播放器要具有如下功能:

(1)可手动添加、删除MP3文件;

(2)可打开、播放、暂停、停止;

(3)可以载入上一次播放列表;

(4)可以调节声音大小;

(5)可以循环播放。

二、准备工作

在开始做课程设计项目前,应回顾或复习的相关内容;需要的VB集成开发环境软件,以及项目牵涉到的哪些原理。

三、系统分析与项目的实现步骤

3.1、对于MP3播放器设计的个人分析、想法

3.1、对于MP3播放器设计的个人分析、想法

1.用过菜单编辑器编辑菜单式的人机界面,可设置弹出式菜单

2.使用MMC控件实现歌曲播放、暂停、停止

3.使用通用对话框实现打开

4.通过数据库记录歌曲全路径,再运行程序使加载到listbox,用listbox的相关属性和命令来实现对歌曲的添加删除,循环播放,可添加清除功能清除所有歌曲以及随机播放功能

5.声音的调节通过使用API函数来实现,可以扩展设置静音

 

系统的功能结构

1.用过菜单编辑器编辑菜单式的人机界面,可设置弹出式菜单,有添加删除清除三个项目

2.利用mci命令,api函数实现歌曲播放、暂停、停止,歌曲播放进度等操作

3.使用通用对话框实现打开文件功能,打开后自动

4.通过mic命令获取mp3文件的位置,通过两个listbox控件,一个隐藏的加载mp3文件全路径,一个显示的保存歌曲名和演唱者(通过对mp3文件获取信息和路径的相关处理得到歌曲名,演唱者)。

两个list的数据一一对应。

用于使得循环播放添加删除功能得以实现

5.声音的调节通过使用用mci命令来实现,可以扩展设置静音,主要利用按钮给出调节声音的指令

3.4.1设计涉及的一些基本知识介绍

1.MP3文件格式简介

 MovingPictureExpertsGroupAudioLayerIII(MPEG-1AudioLayer3,动态图像专家压缩标准音频层面3),经常称为MP3,是当今较流行的一种数字音频编码和有损压缩格式,它设计用来大幅度地降低音频数据量,而对于大多数用户的听觉感受来说,重放的音质与最初的不压缩音频相比没有明显的下降。

它是在1991年,由位于德国埃尔朗根的研究组织Fraunhofer-Gesellschaft的一组工程师发明和标准化的。

   MP3是一个数据压缩格式。

它舍弃脉冲编码调制(PCM)音频数据中,对人类听觉不重要的数据(类似于JPEG是一个有损图像压缩),从而达到了压缩成小得多的文件大小。

MP3中使用了许多技术,其中包括心理声学,以确定音频的哪一部分可以丢弃。

MP3音频可以按照不同的比特率进行压缩,提供了权衡数据大小和音质之间的依据。

(1)、MP3文件结构

   MP3文件大体分为三部分:

TAG_V2(ID3V2),Frame,TAG_V1(ID3V1)

(2)ID3V2

   包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。

(3)Frame

   一系列的帧,个数由文件大小和帧长决定

   每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定

   每个FRAME又分为帧头和数据实体两部分

   帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立

(4)ID3V1

   包含了作者,作曲,专辑等信息,长度为128BYTE。

(5). MP3帧格式

(6)帧头格式

   帧头长4字节(若Protectionbit为1,则还要帧头最后添加16bits的校验位),对于固定位率的MP3文件,所有帧的帧头格式一样其数据结构如下:

 

typedefFrameHeader{

  unsignedintsync:

11;            //同步信息

  unsignedintversion:

2;           //版本

  unsignedintlayer:

2;                  //层

  unsignedinterrorprotection:

1;         //CRC校验

  unsignedintbitrate_index:

4;      //位率

  unsignedintsampling_frequency:

2;    //采样频率

  unsignedintpadding:

1;          //帧长调节

  unsignedintprivate:

1;            //保留字

  unsignedintmode:

2;             //声道模式

  unsignedintmodeextension:

2;    //扩充模式

  unsignedintcopyright:

1;              //版权

  unsignedintoriginal:

1;           //原版标志

  unsignedintemphasis:

2;         //强调模式

}HEADER,*LPHEADER;

 

(7)MP3帧长取决于位率和频率,计算公式为:

.mpeg1.0   layer1:

 帧长=(48000*bitrate)/sampling_freq+padding

            layer2&3:

帧长=(144000*bitrate)/sampling_freq+padding

.mpeg2.0   layer1:

 帧长=(24000*bitrate)/sampling_freq+padding

            layer2&3:

帧长=(72000*bitrate)/sampling_freq+padding

2.API函数

操作系统除了协调应用程序的执行、内存分配、系统资源管理外,同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务是一个函数),可以帮肋应用程序达到开启视窗、描绘图形、使用周边设备的目的,由于这些函数服务的对象是应用程序(Application),所以称之为ApplicationProgrammingInterface,简称API函数。

3.MCI简介

 MCI(MediaControlInterface,媒体控制接口)向Windows程序提供了在高层次上控制媒体设备接口的能力。

程序不必关心具体设备,就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备进行控制。

  对于程序员来说,可以把MCI理解为设备面板上的一排按键,通过选择不同的按键(发送不同的MCI命令)可以让设备完成各种功能,而不必关心设备内部实现。

  比如,对于play,视盘机和CD机有不同的反应(一个是播放视频,一个播放音频),而对用户来说却只需要按同一按钮。

  应用程序通过向MCI发送命令来控制媒体设备。

MCI命令接口分命令字符串和命令消息两种,两者具有相同的功能。

命令字符串具有使用简单的特点,但是它的执行效率不如命令消息。

  所有的MCI命令字符串都是通过多媒体API函数mciSendString传递给MCI的,该函数的声明为:

    MCIERRORmciSendString(

      LPCTSTRlpszCommand,   //MCI命令字符串

      LPTSTR lpszReturnString, //存放反馈信息的缓冲区

      UINT  cchReturn,    //缓冲区的长度

      HANDLE hwndCallback   //回调窗口的句柄,一般为NULL

    );//若成功则返回0,否则返回错误码。

  该函数返回的错误码可以用mciGetErrorString函数进行分析,该函数的声明为:

    BOOLmciGetErrorString(

      DWORD fdwError,   //函数mciSendString返回的错误码

      LPTSTRlpszErrorText,//接收描述错误的字符串的缓冲区

      UINT cchErrorText //缓冲区的长度

    );

  下面是使用mciSendString函数的一个简单例子:

    charbuf[50];

    MCIERRORmciError;

    mciError=mciSendString("opencdaudio",buf,strlen(buf),NULL);

    if(mciError)

    {

      mciGetErrorString(mciError,buf,strlen(buf));

      AfxMessageBox(buf);

      return;

    }

  opencdaudio命令打开CD播放器,如果出错(如驱动器内没有CD)则返回错误码,此时可以用mciGetErrorString函数取得错误信息字符串。

MCI命令

使用MCI设备一般包括打开、使用和关闭三个过程,常用的MCI命令有:

    open    打开设备

    close   关闭设备

    play    开始设备播放

    stop    停止设备的播放或记录

    record   开始记录

    save    保存设备内容

    pause   暂停设备的播放或记录

    resume   恢复暂停播放或记录的设备

    seek    改变媒体的当前位置

    capacility 查询设备能力

    info    查询设备的信息

    status   查询设备状态信息

  MCI的大部分命令可以控制不同的媒体设备,但其中record和save命令并不是所有MCI设备都可以使用。

  MCI命令的使用是很随意的,只要先打开,最后关闭,中间可以随意调用各种命令。

4、模块的使用

VB有3种类型的模块:

窗体模块,标准模块,类模块。

  

  没一个模块都和一个文件相联系,3种模块对应着3中不同类型的文件。

窗体模块存放在扩展名为frm的文件中,标准模块存放在扩展名为bas的文件中,类模块存放在扩展名为cls的文件中。

  

  三类模块说明如下:

  

  1。

简单的程序只有一个模块,这时的程序的代码都存放在这个窗体模块中。

窗体模块是大多数vb程序的基础。

  

  2。

对于复杂的程序可以增加窗体。

为了避免重复,可以将多个窗体都要用到的共同代码集中起来,存放在一个独立的模块中,这个独立的模块成为标准模块。

多个标准模块还可以构成一个模块库。

在标准模块的声名的public变量和常量是在整个工程有效的全局变量和常量。

  

  3。

类模块是面向对象编程的基础。

用户可以使用类模块创建含有属性和方法的自己的对象。

窗体也是一种类模块,是一种可以显示窗体的模块,并且可以把控件拖放到窗体上。

一般的类模块和标准模块都没有可见的用户界面(窗体)。

  

  4。

标准模块中数据的存活期和工程的存活期相同。

类模块中数据的存活期和类的对的存活期相同,随着该类对象的创建而创建,随着该类对象的消失而消失。

  

  5。

当变量在标准模块中声名为public时,他在工程中的任何地方都是可见的(有效的)。

当变量在类模块中声明为public时,在模块外访问该变量是受到限制的,只能访问那些有引用的变量。

3.4.2、MP3播放器的设计原理

不使用控件,直接调用API的函数播放音乐,通过API函数的调用,执行MCI命令,实现播放,暂停,停止,等基本功能,通过添加类模块来实现相应的类模块的信息,在窗体或其他模块中通过定义可以引用,使用类的属性和方法。

通过创建一个文件来保存播放列表的信息,来实现,下一次打开时可以具有记忆功能。

3.4.3、MP3播放器的设计流程图

 

1.清除

可以将歌曲列表清空

程序如下

PrivateSubcls_Click()

DimiAsInteger,lastAsInteger

objPlay.StopMP3

last=lstPlay.ListCount-1

Fori=0Tolast

lstPlay.ListIndex=last-i

DelMP3

Nexti

EndSub

2.上一首,下一首

程序如下:

PrivateSubcmdPrev_Click()'上一首

IflPlayIndex=0Then'正在播放的是第1首

lstPlay.ListIndex=lstPlay.ListCount-1'选中最后一首

Else'否则向前一首

lstPlay.ListIndex=lPlayIndex-1'

EndIf

MP3Play

EndSub

PrivateSubcmdNext_Click()'下一首

IflPlayIndex=lstPlay.ListCount-1Then'播放的是最后一首

lstPlay.ListIndex=0'选中第1首

Else'播放的是位于中间的文件

lstPlay.ListIndex=lPlayIndex+1'播放下一曲

EndIf

MP3Play'播放MP3

EndSub

3.静音

'api函数声明,用于控制音量

PrivateDeclareFunctionSendMessageLib"user32.dll"Alias"SendMessageA"(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong

PrivateSubCommand1_Click()

'音量增大

SendMessagehwnd,793,197266,655360

EndSub

PrivateSubCommand2_Click()

'音量减小

SendMessagehwnd,793,197266,589824

EndSub

PrivateSubImage2_Click()

'静音

SendMessagehwnd,793,2100912,524288

Image2.Visible=False

Image1.Visible=True

EndSub

PrivateSubImage1_Click()

'静音

SendMessagehwnd,793,2100912,524288

Image2.Visible=True

Image1.Visible=False

EndSub

PrivateSubImage2_Click()‘'静音

SendMessagehwnd,793,2100912,524288

Image2.Visible=False

Image1.Visible=True

EndSub

在类模块的声明部分编写以下代码,对类内部要调用的API函数进行声明

PrivateDeclareFunctionmciSendStringLib"winmm.dll"Alias"mciSendStringA"_

(ByVallpstrCommandAsString,ByVallpstrReturnStringAsString,_

ByValuReturnLengthAsLong,ByValhwndCallbackAsLong)AsLong

PrivateDeclareFunctionmciGetErrorStringLib"winmm.dll"Alias_

"mciGetErrorStringA"(ByValdwErrorAsLong,_

ByVallpstrBufferAsString,ByValuLengthAsLong)AsLong

PrivateDeclareFunctionGetShortPathNameLib"kernel32"Alias_

"GetShortPathNameA"(ByVallpszLongPathAsString,_

ByVallpszShortPathAsString,ByValcchBufferAsLong)AsLong

下面是在类模块中定义需要使用的变量

Dimm_FilenameAsString'MP3文件名

Dimm_isOpenAsBoolean'打开标志

Dimm_isPlayAsBoolean'播放标志

Dimm_isPausedAsBoolean'暂停标志

Dimm_sAliasAsString'别名

Dimm_strTitleAsString

Dimm_strAuthorAsString

Dimm_isHasTagAsBoolean'是否有TAG标志变量

ConstsRetAsString="OK"'成功返回值

在类代码中反复执行下面打开MP3文件的操作,根据传入的打开参数的不同,使用不同的打开文件模式而且根据打开文件操作的执行结果不同,分别返回不同的打开文件的结果

PrivateFunctionGetFirstFrame()AsLong

DimbHead

(1)AsByte,lCountAsLong

IfOpenHeaderFile(m_Filename)<>sRetThen'打开MP3文件

ExitFunction

EndIf

ForlCount=1To6000

Get#iFileNo,lCount,bHead(0)'读取文件头

IfbHead(0)=255Then'若找到值为255的字节

Get#iFileNo,lCount+1,bHead

(1)'读取下一个字节

IfbHead

(1)=250OrbHead

(1)=251Then'若为250或251

m_lFirstFrame=lCount'返回文件位置

ExitFunction'退出循环

EndIf

EndIf

Next

CloseHeaderFile

EndFunction

编写OpenMP3函数,发送MCI命令打开需要播放的MP3文件。

该函数定义为Public使其成为类的方法,可供其他模块调用类的功能。

PublicFunctionOpenMP3()AsString'打开MP3

DimsBufferAsString,sFileAsString,lRetAsLong

OnErrorGoToerr

DefBUFsBuffer'定义缓冲区

GetShortPathNamem_Filename,sBuffer,Len(sBuffer)'获取文件名

CheckBUFsBuffer

IfsBuffer=""Then'缓冲区为空

GoToerr

Else

sFile=sBuffer'获取文件名

EndIf

lRet=mciSendString("OPEN"&sFile&"TYPEMPEGVideoALIAS"&m_sAlias,0,0,0)'发送MCI打开指定

IflRetThen'MCI指令失败

OpenMP3=GetMCIError(lRet)'返回错误信息

ExitFunction'退出函数

Else

mciSendString"SET"&m_sAlias&"TIMEFORMATTMSF",0,0,0'发送MCI指令

m_isOpen=True'设置打开标志变真

m_isPlay=False'设置播放标志为假

m_isPaused=False'设置暂停标志为假面具

EndIf

OpenMP3=sRet'返回成功字符串

ExitFunction'退出函数

err:

OpenMP3="打开MP3文件出错!

"

EndFunction

 

编写CloseMP3函数,发送MCI命令关闭真在播放的MP3文件。

该函数定义为Public使其成为类的方法,可供其他模块调用类的功能。

PublicFunctionCloseMP3()AsString'关闭MP3文件

DimlRetAsLong

OnErrorGoToerr

lRet=mciSendString("CLOSE"&m_sAlias,0,0,0)'发送MCI指令

IflRetThen'MCI指令出错

CloseMP3=GetMCIError(lRet)'返回错误信息

ExitFunction'退出函数

Else

m_isOpen=False'打开标志为假

m_isPlay=False'播放标志为假

m_isPaused=False'暂停标志为假

EndIf

CloseMP3=sRet'返回成功字符串

ExitFunction'退出函数

err:

CloseMP3="关闭MP3文件出错!

"

EndFunction

编写PlayMP3函数,发送MCI命令播放指定的MP3文件。

该函数定义为Public使其成为类的方法,可供其他模块调用类的功能。

PublicFunctionPlayMP3(lPosAsLong)AsString'播放MP3

DimlRetAsLong

OnErrorGoToerr

Ifm_isPausedThenlPos=GetPosition

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

当前位置:首页 > 解决方案 > 学习计划

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

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