专业编程基础技术教程

网站首页 > 基础教程 正文

开源库:NAudio C#音频库之录音与播放(一)

ccvgpt 2024-12-28 11:47:30 基础教程 2 ℃

NAudio是一个C#版的音频处理库,支持音频的输入输出,音频文件的处理。

先粗略实现使用NAudio录音

开源库:NAudio C#音频库之录音与播放(一)

整体思路:将控制和响应音频输入设备的功能封闭成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 C#音频库之录音与播放(二)

开源库:NAudio C#音频库之录音与播放(三)

NAudio源码地址:https://github.com/naudio/NAudio

本文代码地址:https://github.com/wuqinchao/JwRecorder

Tags:

最近发表
标签列表