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

内容分享2周前发布
0 0 0

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

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

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

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

接上一篇AudioService完成后,继续实现AudioRecorder类。

这里将使用WaveFileWriter写入文件,有一点需要注意,WaveFileWriter必须要Close或Dispose,否则任何播放软件都会认为音频文件错误,因使用的RIFF格式中,文件头中有两个地方需要填写文件总长和数据总长,WaveFileWriter在Dispose时完成这一任务。如发生意外,导致文件无法使用,可参考RIFF定义手工修复。

关键参数设定

// 同步锁
private readonly object _locker = new object();
// 文件写入
private WaveFileWriter _writer;
// 开始时间
private readonly DateTime _starTime;
// 最后一次接收数据时间
private DateTime _lastAudioData = DateTime.MinValue;

事件

public event RecorderStatusChangedHandle OnRecorderStatusChanged;

启动录音

public void Start() {
    lock (_locker) {
        if (_running) return;
        if (!Directory.Exists(_dir)) {
            Directory.CreateDirectory(_dir);
            Console.WriteLine("创建目录{0}", _dir);
        }
        Console.WriteLine("开始启动录音");
        _running = true;
        // 创建writer, _wav为保存文件的完整路径
        _writer = new WaveFileWriter(_wav, AudioService.Format);
        // 订阅数据事件
        AudioService.Service.DataAvailable += Service_DataAvailable;
        // 通知状态改变
        OnRecorderStatusChanged?.Invoke(this, _running, StarTime, new TimeSpan(0, 0, 0));
    }
}

数据记录

try
            {
                if (_writer == null || !Running) return;                
                _writer.Write(e, 0, e.Length);
                if (!((DateTime.Now - _lastAudioData).TotalMilliseconds > 100)) return;
                _lastAudioData = DateTime.Now;
                OnRecorderStatusChanged?.Invoke(this, Running, StarTime, _writer.TotalTime);
            }
            catch (Exception exp)
            {
                Console.WriteLine(exp);
            }

停止录音

public void Stop() {
    lock (_locker) {
        if (!_running) return;
        _running = false;
        // 注销订阅
        AudioService.Service.DataAvailable -= Service_DataAvailable;
        _writer?.Dispose();
        _writer = null;
        Console.WriteLine("录音停止");
    }
    OnRecorderStatusChanged?.Invoke(this, Running, _starTime, TimeSpan.Zero);
}

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

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

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...