`
zhc0822
  • 浏览: 230357 次
  • 性别: 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  
不错,借用一下

相关推荐

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

    总之,通过结合C#和DirectX的Media Foundation,我们可以构建一个实时监控麦克风输入音量的应用,这在各种音频处理场景中都有实用价值。开发者需要熟悉COM编程、C#事件处理以及DirectX的API调用,才能有效地完成这项...

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

    需要实际监控麦克风的输入音量并显示。类似QQ的语音功能。 可用的技术很多,Windows media encoder、microsoft expression encoder、microsoft SAPI以及microsoft directx均可以实现上述功能。考虑到XP、Vista和win...

    c#获取麦克风音量 百分比显示

    以上代码创建了一个简单的麦克风音量监控器,使用NAudio库获取音频数据,计算音量并每隔一段时间更新UI。请注意,此代码需要在具有适当UI环境的项目中运行,以便显示音量百分比。 在实际应用中,你可能还需要考虑...

    C# wpf 实时显示麦克风音频波形图

    这个项目的主要目标是捕获麦克风输入的音频数据,将其处理为wav格式的文件,并且实时展示音频的时域波形图和频域图。下面我们将详细探讨这些关键点。 1. **C#编程语言**: C#是微软开发的一种面向对象的编程语言,...

    能够实时显示麦克风音量大小的录音系统

    在构建一个能够实时显示麦克风音量大小的录音系统时,我们需要关注多个关键技术和概念。首先,这样的系统需要具备音频输入捕获能力,这通常通过操作系统提供的API或第三方库来实现。例如,在Windows上,我们可以使用...

    C#控制话筒音量调节

    总的来说,这个项目展示了如何使用C#和NAudio库来实现话筒音量的控制,这对于开发音频相关的应用程序,如语音识别、实时通信软件等,都是非常实用的功能。NAudio的强大功能和易用性使得开发者能够专注于业务逻辑,而...

    C# DirectX录音源码

    在本文中,我们将深入探讨如何使用C#与DirectX库来实现录音功能。DirectX是微软推出的一套用于游戏开发和多媒体处理的API,而C#作为.NET框架的一部分,提供了丰富的编程工具和便利的语法,使得它成为实现DirectX应用...

    C#调用海康卫视监控,实时监控、登录功能。

    在本文中,我们将深入探讨如何使用C#编程语言来调用海康卫视的监控系统,实现实时监控和登录功能。海康卫视是一家知名的安防设备制造商,其产品广泛应用于各种监控场景。C#作为.NET框架的主要语言,具有丰富的库支持...

    用C#和directx实现的音乐播放器(带歌词同步功能)

    在本文中,我们将深入探讨如何使用C#编程语言与DirectX图形库来创建一个具有歌词同步功能的音乐播放器。这个项目不仅展示了C#作为高级编程语言的强大功能,还利用了DirectX在多媒体处理方面的优势,使其成为了一个...

    C# 2D绘图,可用于实时监控温度,或者设备状态

    这个压缩包文件"sharpgraphlib-code-r5-trunk"很可能包含了该库的源代码和相关资源,让我们深入探讨一下C# 2D绘图及其在实时监控中的应用。 首先,C#中的2D绘图主要依赖于.NET Framework提供的System.Drawing命名...

    C#调用海康卫视监控,实时监控、登录功能

    本项目涉及的是利用C#编程语言调用海康卫视的API接口,实现对监控设备的实时监控和登录功能。以下是这个主题涵盖的一些关键知识点: 1. **C#编程语言**:C#是微软公司开发的一种面向对象的编程语言,它被广泛用于...

    C# 调用DirectX开发例子20个

    我就不加分了,不知道CSDN里有没有,这是我找的C#开发Directx的例子源码,如果这里已经有了,就看一样不一样了,我这里有20个项目的源码,版主决定吧!对了,提醒大家,需要先安装DirectX的SDK,顺便说一下下载位置...

    C#基于DirectX开发的画出三维点显示的图像

    本文将深入探讨如何使用C#和DirectX来开发一个程序,该程序能够根据用户输入的参数,画出三维点并显示相应的图像。 首先,我们需要理解DirectX的基础。DirectX是由微软开发的一组应用程序接口(APIs),专门用于...

    录音检测输入音量

    录音检测输入音量是IT领域中一种常见的技术应用,尤其在多媒体、通信和安全监控等领域。这项技术的主要目的是实时监测麦克风捕捉到的声音信号,确保音频输入设备正常工作,并能够及时反馈音量信息。以下是对这个主题...

    c#远程桌面连接监控源码

    本主题聚焦于“C#远程桌面连接监控源码”,这涉及到C#编程中的网络通信和图形用户界面(GUI)设计,特别是如何利用Socket技术实现实时远程监控。 首先,C#中的Socket编程是实现网络通信的基础,它允许两台计算机...

    C#使用DirectX获取摇杆外设状态

    在C#中使用DirectX来获取摇杆状态,可以帮助我们实时监测玩家的操作,提升游戏体验。 首先,为了在C#中使用DirectX,我们需要一个能够桥接.NET Framework和DirectX的库。通常,我们可以借助SlimDX或SharpDX这样的...

Global site tag (gtag.js) - Google Analytics