нежелательные звуки тишины в записи NAudio - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь написать приложение, которое записывает звук с микрофона и отправляю его прямо на динамики.Для тестирования я использую гарнитуру, чтобы избежать акустической обратной связи.Я нашел этот урок https://markheath.net/post/how-to-record-and-play-audio-at-same.Так как у меня возникла проблема с моим последним приложением, я создал небольшое тестовое приложение, чтобы убедиться, что причина моей проблемы не в побочном эффекте.Я создаю небольшую тестовую программу с 2 кнопками (старт и стоп), чтобы протестировать ее.Но по какой-то причине записанный звук в моем большом финальном приложении и в этом приложении содержит периодические части тишины, которые я не могу найти почему.

picture of the wave

Этомой код:

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

    }


}

Мое тестовое приложение не содержит ничего, кроме этих 2 кнопок.Кто-нибудь знает, почему я получаю эти партии периодического молчания во время записи?

1 Ответ

0 голосов
/ 22 декабря 2018

Это потому, что BufferedWaveProvider производит тишину, если у него нет буферизованного звука, что может случиться при потоковой передаче звука в реальном времени.Для вас было бы лучше просто записать полученное аудио в WaveFileWriter, а также поместить его в BufferedWaveProvider в RecorderOnDataAvailable вместо использования SavingWaveProvider.

...