开源库: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
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...
