复制并更新主动录制Wav文件的内容到一个新文件
Copy and update content of actively recording Wav file to a new file
我用 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 格式,并且应该能够播放可用的持续时间。每当有更多内容可用时,更新目标文件。
我已经用静态 WAV 文件尝试了以下示例代码(使用 NAudio),但解决方案不起作用。
生成的 WAV 文件已损坏 - 格式不正确。
using (WaveFileReader reader = new WaveFileReader(remoteWavFile))
{
byte[] buffer = new byte[reader.Length];
int read = reader.Read(buffer, 0, buffer.Length);
}
录制过程中,代码抛出异常"File is in use by another application"。
我已经在 NAudio 库本身的帮助下解决了这个问题。
当我们只使用NAudio的WaveFileReader时class。它会抛出异常 - "file is in use by another application"。
所以我不得不创建一个文件流,它打开源文件 - 现场录音文件,File.Open(inPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
然后将这个流作为 WaveFileReader 的输入传递。
然后创建一个class的NAudio的WaveFileWritter,和reader的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);
}
}
}
}
}
}
我用 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 格式,并且应该能够播放可用的持续时间。每当有更多内容可用时,更新目标文件。
我已经用静态 WAV 文件尝试了以下示例代码(使用 NAudio),但解决方案不起作用。
生成的 WAV 文件已损坏 - 格式不正确。
using (WaveFileReader reader = new WaveFileReader(remoteWavFile)) { byte[] buffer = new byte[reader.Length]; int read = reader.Read(buffer, 0, buffer.Length); }
录制过程中,代码抛出异常"File is in use by another application"。
我已经在 NAudio 库本身的帮助下解决了这个问题。
当我们只使用NAudio的WaveFileReader时class。它会抛出异常 - "file is in use by another application"。 所以我不得不创建一个文件流,它打开源文件 - 现场录音文件,
File.Open(inPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
然后将这个流作为 WaveFileReader 的输入传递。然后创建一个class的NAudio的WaveFileWritter,和reader的
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);
}
}
}
}
}
}