该控件是在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
分享到:
相关推荐
使用C#和DirectX实时监控麦克风输入音量
需要实际监控麦克风的输入音量并显示。类似QQ的语音功能。 可用的技术很多,Windows media encoder、microsoft expression encoder、microsoft SAPI以及microsoft directx均可以实现上述功能。考虑到XP、Vista和win...
c#开发的 实时监控麦克风输入音量 转换为百分比显示
C#调用海康卫视监控,实时监控、登录功能。 本人收藏了3年的资源 现放出 都是总结了很多系统 软件项目实施过程中的经验的 慢慢积累的
用C#和directx实现的音乐播放器,带歌词同步功能,同时设计新颖,是个很好的礼物,生日送给女友哦!
基于C#、DirectX录音源码。非常简单实用,希望对大家有帮助。
Visual C#使用DirectX实现视频播放
C# 2D绘图,可用于实时监控温度,或者设备状态
非常简单的话筒控制代码,基于NAudio.dll,可以调节话筒音量,代码量非常少。
C#使用DirectX实现视频播放,中文说明
c# socket实时显示被监控端 桌面内容, 服务端+客户端
c#中采用directX9.0载入3D模型,实现需要下载并且安装DirectX9.0SDK,如果不能运行的话,就在工程中手动引用DirectX.dll,DirectX3D.dll,DirectX3DX.dll
这是用C#开发的电脑屏幕监控系统,可以实现同时监控多台电脑,限于同一个局域网内,如果是要同时监控多台电脑,需要SQL server的支持,分为客户端和服务端(使用时需要改动一下客户端里面的连接ip地址,改为服务端...
vs2010中c#调用directx 9.0 direct3d画二维图形的方法,文档中包括详细的配置,以及初始化等操作。需要自己下载directx 9.0的sdk并安装。 在c#工程中,我添加了两个panel,按下对应的button会画出两个对称的三角形
C#,winform,系统音量控制(最大最小音设置)引用此程序生成的dll文件。导入相应的命名空间,应用到自己的程序中。自己已测试成功。在网上找的复制来粘贴去的内容不适合自己想要我,此文档原文是英文。链接在说明里有...
C#代码实时监控CPU温度、CPU占用率、显卡温度、GPU占用率、风扇转速、内存使用率、磁盘读写速率等硬件信息
C#利用DirectX技术操作.x文件,bin文件夹中附DirectX的dll文件。
1、通过C#实现控制摄像头 2、在demo中实现了对摄像头摄像内容的实时呈现 3、在demo中实现了摄像的播放、停止、关闭功能