NAudio录音中不需要的静音部分 [英] unwanted silence parts in NAudio recording

查看:396
本文介绍了NAudio录音中不需要的静音部分的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试编写一个应用程序,该应用程序记录来自麦克风的声音并将其直接发送给扬声器.为了进行测试,我使用头戴式耳机以避免声音反馈.我发现本教程 https://markheath.net/发布/如何记录并同时播放音频.由于我的最终应用程序对此有问题,因此我创建了一个小型测试应用程序,以确保引起问题的原因不是某些副作用.我创建了一个带有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如果没有缓冲任何音频,则会产生静音,这在实时流式传输音频时会发生.最好将接收到的音频写入WaveFileWriter并将其放入BufferedWaveProvider RecorderOnDataAvailable而不是使用SavingWaveProvider.

I try to write an application that records the sound from the microphone and send it directly to the speakers. For testing I use a headset to avoid an acoustic feedback. I found this tutorial https://markheath.net/post/how-to-record-and-play-audio-at-same . Since I had a problem in my final application with this, I created a small test app to make sure that the cause of my problem isn't some side effect. I create a small test program with 2 buttons (start&stop) to test it. But for some reason the recorded sound in my bigger finale app and in this app has periodic silence parts which I can't find why.

This is my code:

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();

    }


}

My test application doesn't containing anything else than these 2 buttons. Has anybody an idea why I get these periodical silence parts during recording?

解决方案

It's because BufferedWaveProvider produces silence if it doesn't have any audio buffered, which can happen when live streaming audio. It would be better for you simply to write received audio into a WaveFileWriter as well as putting it into BufferedWaveProvider in RecorderOnDataAvailable instead of using SavingWaveProvider.

这篇关于NAudio录音中不需要的静音部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆