首页 > 解决方案 > 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();

    }


}

我的测试应用程序不包含这两个按钮之外的任何其他内容。有人知道为什么我在录制过程中会得到这些周期性的静音部分吗?

标签: c#audio-recordingnaudio

解决方案


这是因为BufferedWaveProvider如果没有缓冲任何音频会产生静音,这可能在实时流式传输音频时发生。最好将接收到的音频写入 aWaveFileWriter并将其放入BufferedWaveProviderRecorderOnDataAvailable不是使用SavingWaveProvider.


推荐阅读