c# - NAudio 录音中不需要的静音部分
问题描述
我尝试编写一个应用程序来记录来自麦克风的声音并将其直接发送到扬声器。为了测试,我使用耳机来避免声反馈。我找到了本教程https://markheath.net/post/how-to-record-and-play-audio-at-same。由于我在最终应用程序中遇到了这个问题,因此我创建了一个小型测试应用程序以确保我的问题的原因不是一些副作用。我创建了一个带有 2 个按钮(开始和停止)的小测试程序来测试它。但由于某种原因,在我更大的结局应用程序和这个应用程序中录制的声音有周期性的静音部分,我找不到原因。
这是我的代码:
public partial class MainWindow : Window
{
private AudioLive MyLive;
public MainWindow()
{
InitializeComponent();
MyLive = new AudioLive();
MyLive.Init();
}
private void ButtonStart(object sender, RoutedEventArgs e)
{
MyLive.StartLive();
}
private void ButtonEnd(object sender, RoutedEventArgs e)
{
MyLive.EndLive();
}
}
class AudioLive
{
private WaveIn m_Recorder;
private BufferedWaveProvider m_BufferedWaveProvider;
private SavingWaveProvider m_SavingWaveProvider;
private WaveOut m_Player;
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
if (m_Recorder != null)
{
m_Recorder.Dispose();
}
m_Recorder = null;
if (m_SavingWaveProvider != null)
{
m_SavingWaveProvider.Dispose();
}
m_SavingWaveProvider = null;
}
private void RecorderOnDataAvailable(object sender, WaveInEventArgs waveInEventArgs)
{
m_BufferedWaveProvider.AddSamples(waveInEventArgs.Buffer, 0, waveInEventArgs.BytesRecorded);
}
public bool Init()
{
m_Recorder = new WaveIn();
m_Recorder.WaveFormat = new WaveFormat(44100, 2);
m_Recorder.DataAvailable += RecorderOnDataAvailable;
// set up our signal chain
m_BufferedWaveProvider = new BufferedWaveProvider(m_Recorder.WaveFormat);
return true;
}
public void StartLive()
{
m_SavingWaveProvider = new SavingWaveProvider(m_BufferedWaveProvider, "live.wav");
// set up playback
m_Player = new WaveOut();
m_Player.Init(m_SavingWaveProvider);
// begin playback & record
m_Player.Play();
m_Recorder.StartRecording();
}
public void EndLive()
{
// stop recording
m_Recorder.StopRecording();
// stop playback
m_Player.Stop();
m_Player.Dispose();
// finalise the WAV file
m_SavingWaveProvider.Dispose();
}
}
我的测试应用程序不包含这两个按钮之外的任何其他内容。有人知道为什么我在录制过程中会得到这些周期性的静音部分吗?
解决方案
这是因为BufferedWaveProvider
如果没有缓冲任何音频会产生静音,这可能在实时流式传输音频时发生。最好将接收到的音频写入 aWaveFileWriter
并将其放入BufferedWaveProvider
而
RecorderOnDataAvailable
不是使用SavingWaveProvider
.
推荐阅读
- python - openCV多边形检测
- vue.js - 如何在选择表单中使用 v-model?
- r - 如何将数据尾部排除在 ggplot2 中数据点大小的影响因素中(使用 scale_size 或类似的东西)?
- c# - 我怎样才能使我的 Raycast2D 引用它击中的每个对象?
- python - Python 最后一个字符 zeo 或一次
- python - 外星人行没有打印
- href - 在我的网站上单击图片时锚链接不起作用
- .net - 如何让 Windows 10 检测到我安装的所有文字转语音?
- ocaml - OCaml 将(无参数)变体序列化为“字符串枚举”(通过 Yojson)
- javascript - 使用Javascript获取提交按钮的父表单