欢迎来到天天文库
浏览记录
ID:38714650
大小:238.00 KB
页数:11页
时间:2019-06-18
《微型计算机接口技术大作业》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、微型计算机接口大作业——DirectX录音程序的实现学院:软件学院专业:网络安全姓名:学号:2011年6月11日星期六程序简介该程序使用DirectX提供的DirectSound来,控制音频驱动程序的各种接口,来录制和储存WAV音频文件。使用接口举例DirectSound中Capture捕获器对象来获取音频捕捉设备DirectSound中的CaptureBuffer捕获缓存储存由音频捕获设备捕获的数据。DirectSound中Notify消息通知对象对象来对缓冲区进行记录和界限。DirectSound中的WaveFormat设定录音的格式。WAV文件的二进制形式WA
2、V文件头格式:虚拟地址数据长度类型描述00H 4 char "RIFF"标志 04H 4long int 文件长度 08H 4 char "WAVE"标志 0CH 4 char "fmt"标志 10H 4 过渡字节(不定) 14H 2 int 格式类别(10H为PCM形式的声音数据) 16H 2 int 通道数,单声道为1,双声道为2 18H 2 int 采样率(每秒样本数),表示每个通道的播放速度, 1CH 4 long int 波形音频数据传送速率,其值为通道数×每秒数据位数×每样 本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。 20H 2 int
3、 数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。 22H 2 每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。 24H 4 char 数据标记符"data" 28H 4 long int 语音数据的长度 缓冲区指针缓冲区是存放音频数据的地方,并且它还提供了我们两个指针:读指针和捕捉指针。它们的位置按照相对于缓冲区起始位置的偏移量计算。读指针位于当前已经被完全捕捉到缓冲区的数据末尾。捕捉指针位于当前将要从硬件中复制的数据块
4、的末尾。如果你想从缓冲区中读取数据,则只能从已经完全写入缓冲区的数据中读取,也就是说我们只能从偏移量小于读指针的地方读取。缓冲区通知时间相同的音频文件,WAVE文件会比其它格式的音频文件大得多,这是因为WAVE文件没有对数据进行压缩。如果录音的时候,不限制缓冲区大小,那么你录制很短的时间可能就会占用很多内存,说不定不过多久,你的2G内存就不够用了。因此我们必须对缓冲区的大小进行限制,而且当缓冲区满了之后,还可以重新从缓冲区起始处开始,用新的数据覆盖旧的数据。为保证不丢失旧的数据,那就得在旧的数据被覆盖之前,将它转移到其它地方。微软提供了“通知”的方法。在缓冲区中的某
5、些位置处设置通知,当读指针到达通知位置的时候,就会触发相应的事件执行转移操作。捕获流程程序代码上述主要在RecordSound类中usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Threading;usingSystem.IO;//对DirectSound的支持usingMicrosoft.DirectX;usingMicrosoft.DirectX.DirectSound;namespace_001{classSou
6、ndRecord{publicconstintcNotifyNum=16;//缓冲队列的数目privateintmNextCaptureOffset=0;//该次录音缓冲区的起始点privateintmSampleCount=0;//录制的样本数目privateintmNotifySize=0;//每次通知大小?privateintmBufferSize=0;//缓冲队列大小privatestringmFileName=string.Empty;//文件名?privateFileStreammWaveFile=null;//文件流privateBinaryWrite
7、rmWriter=null;//写文件privateCapturemCapDev=null;//音频捕捉设备privateCaptureBuffermRecBuffer=null;//缓冲区对象privateNotifymNotify=null;//消息通知对象privateWaveFormatmWavFormat;//录音的格式privateThreadmNotifyThread=null;//处理缓冲区消息的线程privateAutoResetEventmNotificationEvent=null;//通知事件t//////构造函数,设定
此文档下载收益归作者所有