欢迎来到天天文库
浏览记录
ID:54141481
大小:29.50 KB
页数:9页
时间:2020-04-13
《Windows .WAV 文件使用研究论文 .doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Windows.WAV文件使用研究论文Windows.WAV文件使用研究论文Windows.WAV文件使用研究论文Windows.WAV文件使用研究论文Windows.WAV文件使用研究论文Windows.WAV文件使用研究论文Windows.WAV文件使用研究论文 摘要该文介绍了Windows声波文件(*.WAV)的格式,然后分析了在DOS下不使用声音适配卡播放声波文件的关键问题,并给出了程序清单。 关键词DOS应用软件开发多媒体声波文件在DOS应用软件开发过程中,我们非常希望能在不附加任何硬件设备的
2、条件下实现一些简单的多媒体功能。 过去许多文章中都讨论过Windows图像文件(*.BMP,*.PCX)的格式及其用于美化DOS程序界面的方法。在以后,Windows又提供了标准的声波文件(*.WAV),因此我们可以利用已有的声波文件镶嵌在自己的软件中,在DOS下实现语音或其它音响的播放,提高我们的软件质量。 一、声波文件格式分析 *.WAV文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文ResourceInterchangeFileFormat的缩写,每个WAV文件
3、的头四个字节便是“RIFF”。 常见的声波文件主要有两种,分别对应于单声道(采样率、8Bit的采样值)和双声道(采样率、16Bit的采样值)。这里,采样率是指:声波信号[模→数]转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声波模拟信号的积分值,在编程播放过程中我们认为它是扬声器在此周期单位时间段的音量。 *.WAV文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件标识段和声波数据格式说明段两部分。 WAV文件各部分内容及格式见附表。 对于单声道声波文件,采样数据为八
4、位的短整数(shortint00H-FFH);而对于双声道立体声声波文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。 @@;*.WAV文件格式说明表@@ 二、WAV文件编程 在没有声音适配卡的条件下,利用PC机内部扬声器发声需解决几个关键问题。 首先是如何产生按指定采样率要求的标准时间间隔段,以此为基础控制扬声器发声。 由于此时间段要求精确且非常短暂,因此实现起来有一定的难度。解决该问题的思路是修改8253定时器芯片的计数器0(地址:040H)的初始值,改变系统
5、时钟中断频率使其和采样率相一致,建立用户的时钟中断例程,最终产生标准的时间间隔段。但是在我们修改原有系统时钟中断(Int08H)以后,最终必须恢复原有的系统时钟中断。 其次是如何快速地打开和关闭扬声器。解决这个问题的方法是直接向8255芯片端口(地址:061H)写操作。由于PC机机内扬声器发声只有开/闭两种状态,并不能控制音量大小。 因此还须考虑如何通过开闭扬声器来摸拟实现音量大小的控制。实现方法是:在每个时间单位内通过改变扬声器打开延时的长短代表音量的大小。例如:对于8Bit单声道声波文件,采样数据的
6、最大值是0FFH,那么在每个标准时间单位内扬声器打开时间应为Delay=(采样值/256)*标准时间段长度。在此思想下可以将该方法简化,设扬声器延时只有0、1(时间单位)两种情况,即在每个时间单位内,如果采样值大于128则发声,如果采样值小于128就不发声。显然这样做是以抛弃大量声波信息为代价的,采用的信息量只占原有用信息的1/12 8,所以这种方法产生的音质较差。 三、程序实例 下面是一个能播放/8Bit/单声道声波文件的演示程序。关于使用*.WAV文件的其它细节,可通过阅读本程序得到。它采用了第二
7、种延时方式,如果读者有兴趣提高音质可将其改成使用第一种方法,只需将newint08h中的声音开/关判断(与128比较)部分改成循环等待即可。 循环次数通过i=int(vol[counter]/256)*MAXTIMES得到。 式中MAXTIMES为延长一个标准时间单位的循环次数。 程度运行环境:486兼容机,,编译系统。 /*/*/* *.WAV文件播放程序,石宁 */*/*/ #include”“ #include”“ #include”“ #defineMAXSIZE50000 s
8、tructwave-file_head/*声波*/ {/*文件头*/ charriff_id[4];/*结构体*/ longintsize0; charwave-fmt[8]; lontintsizel; intfmttag; intchannel; longintsamplespersec; longintbytepersec; intblockalign; intbitpersample
此文档下载收益归作者所有