NAudio 录音中不需要的静音部分

Posted

技术标签:

【中文标题】NAudio 录音中不需要的静音部分【英文标题】:unwanted silence parts in NAudio recording 【发布时间】:2018-12-19 08:29:33 【问题描述】:

我尝试编写一个应用程序来记录来自麦克风的声音并将其直接发送到扬声器。为了测试,我使用耳机来避免声反馈。我找到了这个教程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();

    



我的测试应用程序只包含这 2 个按钮。有人知道为什么我在录制过程中会得到这些周期性的静音部分吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

我不确定我是否理解正确,在RecorderOnDataAvailable 中,我应该使用m_WaveFileWriter.Write(waveInEventArgs.Buffer, 0, waveInEventArgs.BytesRecorded); 而不是BufferedWaveProvider,而且我也不需要 SavingWaveProvider。对?但是m_Player.Init(m_WaveFileWriter); 那么应该是什么样子呢?因为m_WaveFileWriter 在那里产生错误 你也想播放音频吗?如果是这样,将其写入 BufferedWaveProvider,并将其传递给 Init 是的,我想及时向扬声器播放我像扩音器一样录制的内容 对不起,如果我再问一次,但昨天您写道,我应该使用 bufferedwaveprovider,但在您的第一个回答中,您写道,这就是我的声音中出现静音中断的原因,我有点困惑现在我该怎么办。我想对着耳机的麦克风说话,并同时或至少在一小段时间偏移时听到我在耳机中所说的内容。使用 bufferedwaveprovider 时,我遇到的问题是即使我还在说话,也会出现静音中断。这听起来像是手机连接不良,您只能听到另一端所说的部分内容

以上是关于NAudio 录音中不需要的静音部分的主要内容,如果未能解决你的问题,请参考以下文章

使用 nAudio 播放多个文件时的音量控制

使用 NAudio 创建静音 WAVE 流

NAudio 中的静音功能 (waveOut)

NAudio - 如何记录扬声器的初始静音

使用 NAudio 录制音频并在麦克风输入静音时写入文件

枚举 NAudio 中的录音设备