`
zhc0822
  • 浏览: 228547 次
  • 性别: Icon_minigender_1
  • 来自: 宝仔的奇幻城堡
社区版块
存档分类
最新评论

使用C#和DirectX实时监控麦克风输入音量

阅读更多
该控件是在Jacob Klint的作品之上精简而来。特此鸣谢。
现在在开发一个语音录制软件。需要实际监控麦克风的输入音量并显示。类似QQ的语音功能。
可用的技术很多,Windows media encoder、microsoft expression encoder、microsoft SAPI以及microsoft directx均可以实现上述功能。考虑到XP、Vista和win7的兼容,最终采用directx作为技术方案。
先让我们来看一下成品的效果:



思路是这样的:
捕捉声音,然后启动线程,每隔一段时间从缓存中读数据,求出该组数据的电平值,更新ProgressBar控件。

  • 首先我们需要从声卡中捕捉声音(audio capture)。使用directx捕捉声音的具体步骤如下:
// 创建 capture 对象
Capture cap = new Capture(audioDevices[deviceIndex].DriverGuid);
// 创建对 capture buffer对象的描述
CaptureBufferDescription desc = new CaptureBufferDescription();
WaveFormat wf = new WaveFormat();
wf.BitsPerSample = 16;
wf.SamplesPerSecond = 16000;
// 单声道
wf.Channels = 1;
// 数据的最小的原子单元
wf.BlockAlign = (short)(wf.Channels * wf.BitsPerSample / 8);
wf.AverageBytesPerSecond = wf.BlockAlign * wf.SamplesPerSecond;
// 未经压缩的PCM
wf.FormatTag = WaveFormatTag.Pcm;
desc.Format = wf;
desc.BufferBytes = SAMPLES * wf.BlockAlign;
// 创建 capturebuffer对象
buffer = new Microsoft.DirectX.DirectSound.CaptureBuffer(desc, cap);
// 捕捉数据至缓存
buffer.Start(true);

  • 然后,我们需要启动一个线程,来监控音量并修改UI控件。
liveVolumeThread = new Thread(new ThreadStart(updateProgress));
liveVolumeThread.Priority = ThreadPriority.Lowest;
liveVolumeThread.Start();

  • 下面让我们来实现updateProgress这个方法。第一步,读入声音数据,写入一个数组。
Array samples = buffer.Read(0, typeof(Int16), LockFlag.FromWriteCursor, SAMPLE_FORMAT_ARRAY);

  • 第二步,求出此组数据的电平值
int goal = 0;
for (int i = 0; i < SAMPLES; i++)
{
    goal += (Int16)samples.GetValue(i, 0, 0);
}
goal = (int)Math.Abs(goal / SAMPLES);
  • 最后一步,设置progressbar的值,让线程睡眠一个固定的值。
progressBar.Value = goal;
Thread.Sleep(tempFrameDelay);

该控件实现了usercontrol接口,故可以在界面设计器中直接拖放。
调用Start()方法开启捕捉;
调用Stop()方法关闭捕捉;
更多属性请查看属性面板。

运行示例代码的时候,如果提示“检测到loaderlocker”这样的异常,处理方法为:
调试-异常-managed debugging assistants-将loaderlocker的勾反选。(如图)





  • 大小: 20.4 KB
  • 大小: 1.8 KB
7
4
分享到:
评论
4 楼 杀盗非杀人 2016-01-05  
运行不了 而且还出现异常
3 楼 cc2012linya 2015-09-17  
不错,先研究研究,谢LZ
2 楼 oy_love 2015-07-03  
注册第一天不能下载!终于可以下载却打不开。。。
1 楼 xuhongbin8888 2013-04-26  
不错,借用一下

相关推荐

Global site tag (gtag.js) - Google Analytics