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

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

 

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

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

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

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

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

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

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


使用C#和DirectX实时监控麦克风输入音量_第1张图片 


  • VolumeMeter.zip (189 KB)
  • 下载次数: 711
  • 查看图片附件

from:http://fantasticinblur.iteye.com/blog/678527


你可能感兴趣的:(音频)