微型计算机接口技术大作业.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
微型计算机接口技术大作业

微型计算机接口大作业 ——DirectX录音程序的实现 学院: 软件学院 专业: 网络安全 姓名: 学号: 2011年6月11日星期六 程序简介 该程序使用DirectX提供的DirectSound来,控制音频驱动程序的各种接口,来录制和储存WAV音频文件。 使用接口举例 DirectSound中Capture捕获器对象来获取音频捕捉设备 DirectSound中的CaptureBuffer捕获缓存储存由音频捕获设备捕获的数据。 DirectSound中Notify消息通知对象对象来对缓冲区进行记录和界限 。 DirectSound中的WaveFormat设定录音的格式。 WAV文件的二进制形式 WAV文件头格式: 虚拟地址 数据长度 类型 描述 00H ?4? char ?RIFF标志? 04H?4 long?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 ?数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。? 22H?2? ?每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。? 24H?4? char ? 数据标记符"data"? 28H?4? long?int? 语音数据的长度?缓冲区是存放音频数据的地方,并且它还提供了我们两个指针:读指针和捕捉指针。它们的位置按照相对于缓冲区起始位置的偏移量计算。读指针位于当前已经被完全捕捉到缓冲区的数据末尾。捕捉指针位于当前将要从硬件中复制的数据块的末尾。如果你想从缓冲区中读取数据,则只能从已经完全写入缓冲区的数据中读取,也就是说我们只能从偏移量小于读指针的地方读取。 时间相同的音频文件,WAVE文件会比其它格式的音频文件大得多,这是因为WAVE文件没有对数据进行压缩。如果录音的时候,不限制缓冲区大小,那么你录制很短的时间可能就会占用很多内存,说不定不过多久,你的G内存就不够用了。因此我们必须对缓冲区的大小进行限制,而且当缓冲区满了之后,还可以重新从缓冲区起始处开始,用新的数据覆盖旧的数据。丢失旧的数据,那就得在旧的数据被覆盖之前,将它转移到其它地方。微软提供了“通知”。在缓冲区中的某些位置处设置通知,当读指针到达通知位置的时候,就会触发相应的事件执行转移操作。 程序代码 上述主要在RecordSound类中 using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Threading; using System.IO; // 对DirectSound的支持 using Microsoft.DirectX; using Microsoft.DirectX.DirectSound; namespace _001 { class SoundRecord { public const int cNotifyNum = 16; // 缓冲队列的数目 private int mNextCaptureOffset = 0; // 该次录音缓冲区的起始点 private int mSampleCount = 0; // 录制的样本数目 private int mNotifySize = 0; // 每次通知大小? private int mBufferSize = 0; // 缓冲队列大小 private string mFileName = string.Empty; // 文件名? private FileStream mWaveFile = null; // 文件流 private Binar

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档