Начать запись волны с помощью naudio, когда входной звук достигнет определенного уровня

Я пытаюсь создать приложение, которое позволяет мне записывать 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();
    }
}

person ChrisLupson    schedule 12.12.2011    source источник
comment
Пожалуйста, не добавляйте к названиям префикс C#. Вот для чего нужны теги. Также см. meta.stackexchange.com/questions/2950/   -  person John Saunders    schedule 13.12.2011


Ответы (1)


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

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

person Mark Heath    schedule 16.12.2011