簡體   English   中英

沒有音頻時停止錄制

[英]Stop recording when there is no audio

我正在使用Naudio Library開發語音錄音程序。 現在要記錄,我必須按“記錄”按鈕,然后按“保存”按鈕。 我想讓程序一直錄制,並自動保存錄制的音頻。 感謝您的幫助。 這是一些代碼。 開始錄制:

    NAudio.Wave.WaveIn sourceStream = null;
    NAudio.Wave.WaveFileWriter waveWriter = null;

    private void SRecording_Click(object sender, EventArgs e)
    {
     if (sourceList.SelectedItems.Count == 0) return;

            SaveFileDialog save = new SaveFileDialog();
            save.Filter = "Wave File (*.wav)|*.wav;";
            string wavoutputpath = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            wavoutputpath += "\\Speech.wav";
            save.FileName = wavoutputpath;

            int deviceNumber = sourceList.SelectedItems[0].Index;

            sourceStream = new NAudio.Wave.WaveIn();
            sourceStream.DeviceNumber = deviceNumber;
            sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels);

            sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable);
            waveWriter = new NAudio.Wave.WaveFileWriter(save.FileName, sourceStream.WaveFormat);

            sourceStream.StartRecording();
    }

    private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
    {
        if (waveWriter == null) return;

        waveWriter.WriteData(e.Buffer, 0, e.BytesRecorded);
        waveWriter.Flush();
    }

停止錄制:

        if (sourceStream != null)
        {
            sourceStream.StopRecording();
            sourceStream.Dispose();
            sourceStream = null;
        }
        if (waveWriter != null)
        {
            waveWriter.Dispose();
            waveWriter = null;
        }

如果您只想在沒有音頻的情況下停止錄音,則可以檢查是否經過了一定數量的“無聲”采樣。 WaveIn.DataAvailable事件處理程序中,您可以通過查看e.Buffer中的字節來檢查每個樣本。 假設您以16 bit錄制,每2 bytes組成一個樣本。 您可以將其轉換為Int16進行檢查。 同樣,為了在音頻再次可用時開始錄制,您可以檢查樣本值,如果樣本值超過閾值,則可以開始寫入。

@Jester有一個很好的答案,只是沒有代碼可以幫助其他不知道如何實現此目標的人。

音頻不是我的專業領域,但是,我想到的是:

int threshold = <SETYOURTHRESHOLD>;
int value = Math.Abs(BitConverter.ToInt16(e.Buffer, (e.BytesRecorded - 2)));
if (value < threshold)
    sourceStream.StopRecording();

全部在:

public void sourceStream_DataAvailable(object sender, WaveInEventArgs e)

方法。

當然,這僅僅是一個開始,需要更多的工作才能將其變成運行良好的機器!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM