网站首页 > 基础教程 正文
NAudio是一个C#版的音频处理库,支持音频的输入输出,音频文件的处理。
先粗略实现使用NAudio录音
整体思路:将控制和响应音频输入设备的功能封闭成AudioService,单例模式,负责设置音频参数,启动停止音频输入设备,接收和向订阅者分发设备音频数据。将生成音频文件功能封闭为AudioRecorder,负责生成和写入音频数据。
首先建立工程、项目,通过NuGet安装NAudio库
选择音频输入设备
获取音频输入设备总数 WaveIn.DeviceCount
获取指定音频设备信息 WaveIn.GetCapabilities(int devNumber)
AudioService部分
关键参数设定
// 单例
public static readonly AudioService Service = null;
// 音频采样率 [8000,16000,32000,44100,48000]
public const int SampleRate = 48000;
// 格式采用单通道
public static readonly WaveFormat Format = new WaveFormat(SampleRate, 1);
//设备使用WaveInEvent而没有使用WaveIn,因为封装成service,不一定需要UI支持
private WaveInEvent _waveIn;
事件定义
// 向外分发音频数据,之后的AudioService将订阅此事件
public event EventHandler<byte[]> DataAvailable;
打开指定的音频输入设备
private void StartService(int devNumber) {
lock (_locker) {
if (_running) return;
//指定使用设备的序号
_device = devNumber;
//失败后重新尝试
while (!OpenDevice()) {
Thread.Sleep(1000);
Console.WriteLine("音频设备启动失败,将于1秒后重试");
}
}
}
private bool OpenDevice() {
try {
_waveIn = new WaveInEvent {
WaveFormat = Format, //格式
DeviceNumber = _device //设备序号
};
//接收音频数据,接收到的数据为100ms长度音频一帧
_waveIn.DataAvailable += OnDataAvailable;
// 订阅状态事件
_waveIn.RecordingStopped += OnRecordingStopped;
// 启动设备,这里并没有开始记录,只是开始接收音频
// 不要被名字误导
_waveIn.StartRecording();
// 设备音量控制, 略过。
TryGetVolumeControl();
_running = true;
} catch (Exception e) {
Console.WriteLine("OpenDevice失败", e);
_running = false;
return false;
}
Console.WriteLine("音频服务已启动");
ServiceStarted?.Invoke(this, null);
return true;
}
分发事件
private void OnDataAvailable(object sender, WaveInEventArgs e) {
DataAvailable?.Invoke(sender, e.Buffer);
}
停止服务等部分略过。
NAudio源码地址:https://github.com/naudio/NAudio
本文代码地址:https://github.com/wuqinchao/JwRecorder
猜你喜欢
- 2024-12-28 CSnakes:在.NET项目中嵌入Python代码的工具
- 2024-12-28 巧用泛型设计模式,提升代码质量新高度
- 2024-12-28 巅峰对决!Spring Boot VS .NET 6 巅峰对决之干碎龙王短剧全集完整版第5集
- 2024-12-28 基于C#开发的物联网设备通讯协议客户端终身开源免费
- 2024-12-28 C# Flurl 库浅析(一) c#folderbrowserdialog
- 2024-12-28 C# Lazy的缺点 c#的介绍
- 2024-12-28 微服务——webapi实现,脱离iis,脱离tomcat
- 2024-12-28 231.C# 跨平台服务开发 c++跨平台开发
- 2024-12-28 C# 和 .NET 开发的 10 种基本模式
- 2024-12-28 基于C# 开发的物联网设备通讯协议客户端
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)