用DirectSound在C++.net平台上实现录音功能

  最近在做一个普通话纠正练习软件,里面要有一个录音的功能。关于音频的东西之前没怎么接触,所以在网上找了一些相关资料。由于.net窗体程序和mmsystem.h的头文件各种报错,所以最后决定用DirectSound来实现。如果是MFC程序的话,可能有mmsystem.h会更方便点。。。

主要参考了http://www.cnblogs.com/stg609/archive/2008/10/24/1318931.html 这个人的博客。

总体思路是:

  • 设置wave文件的格式//这里要了解一下波形捕捉的基本知识,比如说采样率什么的。
  • 捕获录音设备
  • 创建捕获缓冲区
  • 创建wave文件
  • 创建缓冲区通知
  • 开始录音
  • 新开一条线程捕获波形
  • 把捕获到的写入wave文件
  • 停止录音,关闭缓冲区和新线程,把文件长度,数据长度写入文件

  参考的博客上写的是C#代码,所以转到C++.net上会有各种奇怪的格式错误等等,所以了解了不少C#和托管C++的类型转换。

ContractedBlock.gif ExpandedBlockStart.gif 头文件
 
   
1 #pragma once
2
3   #define iNotifyNum 16
4 typedef unsigned char byte ;
5
6   using namespace System;
7   using namespace System::IO;
8   using namespace System::Threading;
9   using namespace Microsoft::DirectX;
10   using namespace Microsoft::DirectX::DirectSound;
11
12   enum RecordMode{Recording, Stop, Pause};
13
14   public ref class SoundRecord
15 {
16   public :
17 SoundRecord(); // 构造函数
18   ~ SoundRecord(); // 析构函数
19   void recordingStart(String ^ path); // 开始录音
20   void recordingStop(); // 停止录音
21 void recordingPause(); // 暂停录音
22 void recordingResume(); // 恢复录音
23 RecordMode recordMode;
24
25 private :
26 Notify ^ myNotify; // 缓冲区提示事件
27 FileStream ^ fsWav; // 保存的文件流
28 int iBufferOffset ; // 本次数据起始点, 上一次数据的终点。
29 int iSampleSize; // 所采集到的数据大小
30 int iNotifySize; // 通知所在区域大小
31 int iBufferSize; // 缓冲区大小
32 BinaryWriter ^ mWriter;
33 Microsoft::DirectX::DirectSound::Capture ^ capture; // 捕捉设备对象
34 CaptureBuffer ^ capturebuffer; // 捕捉缓冲区
35 AutoResetEvent ^ notifyevent;
36 Thread ^ notifythread ;
37 WaveFormat mWavFormat; // PCM格式
38
39 WaveFormat SetWaveFormat();
40 void CreateWaveFile(String ^ strFileName);
41 bool CreateCaputerDevice();
42 void CreateCaptureBuffer();
43 void CreateNotification();
44 void RecoData();
45 void RecordCapturedData();
46 };

代码下载:http://files.cnblogs.com/sandywong/SoundRecord.rar

转载于:https://www.cnblogs.com/sandywong/articles/2008149.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值