我使用NAudio
图书馆以WAV格式进行了有效的录音。
private void RecordStart() {
try {
_sourceStream = new WaveIn {
DeviceNumber = _recordingInstance.InputDeviceIndex,
WaveFormat =
new WaveFormat(
44100,
WaveIn.GetCapabilities(_recordingInstance.InputDeviceIndex).Channels)
};
_sourceStream.DataAvailable += SourceStreamDataAvailable;
if (!Directory.Exists(_recordingInstance.AudioFilePath)) {
Directory.CreateDirectory(_recordingInstance.AudioFilePath);
}
WaveFileWriter _waveWriter = new WaveFileWriter(
_recordingInstance.AudioFilePath + _recordingInstance.AudioFileName,
_sourceStream.WaveFormat);
_sourceStream.StartRecording();
}
catch (Exception exception) {
Log.Error("Recording failes", exception);
}
}
private void SourceStreamDataAvailable(object sender, WaveInEventArgs e) {
if (_waveWriter == null) return;
_waveWriter.Write(e.Buffer, 0, e.BytesRecorded);
_waveWriter.Flush();
}
我想将最新的可用内容复制到其他位置。复制的文件应采用WAV格式,并且应该能够播放可用的持续时间。只要有更多内容,就更新目标文件。
我尝试了以下示例代码(使用NAudio)和静态WAV文件,但该解决方案无效。
创建的WAV文件已损坏 - 格式不正确。
using (WaveFileReader reader = new WaveFileReader(remoteWavFile))
{
byte[] buffer = new byte[reader.Length];
int read = reader.Read(buffer, 0, buffer.Length);
}
当录制正在进行时,代码会抛出异常"另一个应用程序正在使用该文件"。
答案 0 :(得分:0)
我已经在NAudio Library本身的帮助下解决了这个问题。
当我们只使用NAudio的WaveFileReader类时。它将抛出异常 - "文件正由另一个应用程序使用"。
所以我必须创建一个文件流,打开源文件 - 实时录制文件,File.Open(inPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
然后将此流作为WaveFileReader的输入传递。
然后创建一个NAudio的WaveFileWritter类,与读者的WavFormat
相同。
public static void CopyWavFile(string inPath, string outPath){
using (var fs = File.Open(inPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)){
using (var reader = new WaveFileReader(fs)){
using (var writer = new WaveFileWriter(outPath, reader.WaveFormat)){
reader.Position = 0;
var endPos = (int)reader.Length;
var buffer = new byte[1024];
while (reader.Position < endPos){
var bytesRequired = (int)(endPos - reader.Position);
if (bytesRequired <= 0) continue;
var bytesToRead = Math.Min(bytesRequired, buffer.Length);
var bytesRead = reader.Read(buffer, 0, bytesToRead);
if (bytesRead > 0){
writer.Write(buffer, 0, bytesRead);
}
}
}
}
}
}