Начните запись волны, используя naudio, когда входной сигнал достигнет определенного уровня - PullRequest
2 голосов
/ 13 декабря 2011

Я пытаюсь создать приложение, которое позволяет мне записывать wav-файл каждый раз, когда объем ввода превышает заданный объем.

У меня есть код для записи звука с кнопки, но я хотел бы автоматизировать его, мой код ниже:

public partial class Form1 : Form
{
    private WaveIn waveIn;
    private WaveFileWriter writer;
    String outputFilename = @"c:\test.wav";

    public Form1()
    {
        InitializeComponent();

        int sampleRate = 22000;
        int channels = 1;
        waveIn = new WaveIn();
        waveIn.WaveFormat = new WaveFormat(sampleRate, channels);
        waveIn.DeviceNumber = 0;
        waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(
            waveIn_DataAvailable);
        writer = new WaveFileWriter(outputFilename, waveIn.WaveFormat);        
        waveIn.StartRecording();   
    }

    void waveIn_DataAvailable(object sender, WaveInEventArgs e)
    {
        writer.WriteData(e.Buffer, 0, e.BytesRecorded);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        waveIn.StopRecording();
        waveIn.Dispose();
        writer.Close();
    }
}

1 Ответ

3 голосов
/ 16 декабря 2011

в waveIn_DataAvailable вы можете проверить каждый образец, посмотрев на байты в e.Buffer.(Предполагая, что вы записали в 16-битном формате, каждая пара байтов представляет собой одну выборку - используйте BitConverter.ToInt16 ).Если какой-либо из сэмплов превышает указанное вами пороговое значение, вы можете написать с помощью writer.WriteData.

. Чтобы отключить запись, вы, вероятно, захотите проверить, что определенное количество «тихих» сэмплов прошло.

...