using System;
using System.IO;
using System.Threading;
using NAudio.Wave;
namespace XHWK.WKTool.Utils
{
public class ZAudioRecordHelper
{
public enum RecordType
{
Loudspeaker = 0, // 扬声器
Microphone = 1 //麦克风
}
public enum RecordState
{
Stop = 0,
Start = 1,
Pause = 2
}
//录制的类型
private RecordType _t;
private RecordState _state;
//录制麦克风的声音
private WaveInEvent _waveIn; //new WaveInEvent();
//录制扬声器的声音
private WasapiLoopbackCapture _capture; //new WasapiLoopbackCapture();
//生成音频文件的对象
private WaveFileWriter _writer;
private string _audioFile;
public ZAudioRecordHelper(string filePath, RecordType type)
{
_t = type;
_audioFile = filePath;
_state = RecordState.Pause;
try
{
if (_t == RecordType.Microphone)
{
_waveIn = new WaveInEvent();
_writer = new WaveFileWriter(_audioFile, _waveIn.WaveFormat);
//开始录音,写数据
_waveIn.DataAvailable += (s, a) =>
{
if (_state == RecordState.Start)
{
_writer.Write(a.Buffer, 0, a.BytesRecorded);
}
};
//结束录音
_waveIn.RecordingStopped += (s, a) =>
{
_writer.Dispose();
_writer = null;
_waveIn.Dispose();
};
_waveIn.StartRecording();
}
else
{
_capture = new WasapiLoopbackCapture();
_writer = new WaveFileWriter(_audioFile, _capture.WaveFormat);
_capture.DataAvailable += (s, a) =>
{
if (_state == RecordState.Start)
{
_writer.Write(a.Buffer, 0, a.BytesRecorded);
}
};
//结束录音
_capture.RecordingStopped += (s, a) =>
{
_writer.Dispose();
_writer = null;
_capture.Dispose();
};
_capture.StartRecording();
}
}
catch (Exception)
{
// ignored
}
}
///
/// 开始录制
///
public void StartRecordAudio()
{
_state = RecordState.Start;
}
///
/// 结束录制
///
public void StopRecordAudio()
{
_state = RecordState.Stop;
if (_t == RecordType.Microphone)
{
_waveIn.StopRecording();
}
else
{
_capture.StopRecording();
}
}
///
/// 暂停录制
///
public void PauseRecordAudio()
{
_state = RecordState.Pause;
}
///
/// 恢复录制
///
public void ResumeRecordAudio()
{
_state = RecordState.Start;
}
///
/// 设备是否可用
///
///
///
public static bool IsDeviceGood(RecordType type)
{
string tempPath = Path.GetTempPath();
// Console.WriteLine("临时路径:" + tempPath);
WaveInEvent mWaveIn;
WaveFileWriter mWriter = null;
WasapiLoopbackCapture mCapture;
try
{
if (type == RecordType.Microphone)
{
string mAudioFile = Path.Combine(tempPath, "_microphone.mp3");
mWaveIn = new WaveInEvent();
mWriter = new WaveFileWriter(mAudioFile, mWaveIn.WaveFormat);
//开始录音,写数据
mWaveIn.DataAvailable += (s, a) => { mWriter.Write(a.Buffer, 0, a.BytesRecorded); };
//结束录音
mWaveIn.RecordingStopped += (s, a) =>
{
if (mWriter != null)
{
mWriter.Dispose();
}
mWriter = null;
mWaveIn.Dispose();
if (File.Exists(mAudioFile))
{
File.Delete(mAudioFile);
}
};
mWaveIn.StartRecording();
ThreadPool.QueueUserWorkItem(
o =>
{
Thread.Sleep(200);
mWaveIn.StopRecording();
}
);
}
else
{
string mAudioFile = Path.Combine(tempPath, "_loudspeaker.mp3");
mCapture = new WasapiLoopbackCapture();
mWriter = new WaveFileWriter(mAudioFile, mCapture.WaveFormat);
mCapture.DataAvailable += (s, a) =>
{
mWriter?.Write(a.Buffer, 0, a.BytesRecorded);
};
//结束录音
mCapture.RecordingStopped += (s, a) =>
{
mWriter?.Dispose();
mWriter = null;
mCapture.Dispose();
if (File.Exists(mAudioFile))
{
File.Delete(mAudioFile);
}
};
mCapture.StartRecording();
ThreadPool.QueueUserWorkItem(
o =>
{
Thread.Sleep(200);
mCapture.StopRecording();
}
);
}
}
catch (Exception)
{
if (mWriter != null)
{
mWriter.Dispose();
mWriter = null;
}
return false;
}
return true;
}
}
}