Запись звука с микрофона в массив байтов

465
21 марта 2017, 10:36

Доброго времени суток. Можете объяснить почему второй код не совсем правильно работает? При воспроизведении записанного файла слышно только звуки похожие на щелчки мыши. Хотя от первого кода (отлично работающего) он отличается только тем что буфер не сразу записывается в файл, а добавляется в список, затем после окончания записи весь буфер из списка записывается в файл.

Первый код

using NAudio.Wave;
namespace Record
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        WaveIn waveIn;
        WaveFileWriter waveWriter;

        private void waveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
            if (waveWriter == null) return;
            waveWriter.Write(e.Buffer, 0, e.BytesRecorded);
            waveWriter.Flush();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            waveIn = new WaveIn();
            waveIn.DeviceNumber = 0;
            string outputFilename = @"D:/demo.wav";
            waveIn.WaveFormat = new WaveFormat(44100, WaveIn.GetCapabilities(waveIn.DeviceNumber).Channels);
            waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(waveIn_DataAvailable);
            waveWriter = new WaveFileWriter(outputFilename, waveIn.WaveFormat);
            waveIn.StartRecording();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            if (waveIn != null)
            {
                waveIn.StopRecording();
                waveIn.Dispose();
                waveIn = null;
            }
            if (waveWriter != null)
            {
                waveWriter.Dispose();
                waveWriter = null;
            }
        }
    }
}

Второй код

using NAudio.Wave;
namespace RecordReally
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        WaveIn waveIn;
        WaveFileWriter waveWriter;
        string outputFilename = @"D:/demo.wav";
        List<byte[]> bytes = new List<byte[]>();
        private void waveIn_DataAvailable(object sender, WaveInEventArgs e)
        { 
            bytes.Add(e.Buffer);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            waveIn = new WaveIn();
            waveIn.DeviceNumber = 0;
            waveIn.WaveFormat = new WaveFormat(44100, WaveIn.GetCapabilities(waveIn.DeviceNumber).Channels);
            waveWriter = new WaveFileWriter(outputFilename, waveIn.WaveFormat);
            waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(waveIn_DataAvailable);
            waveIn.StartRecording();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            if (waveIn != null)
            {
                waveIn.StopRecording();
                waveIn.Dispose();
                waveIn = null;
            }
            foreach (byte[] buffer in bytes)
            {
                waveWriter.Write(buffer, 0, buffer.Length);
                waveWriter.Flush();
            }
            if (waveWriter != null)
            {
                waveWriter.Dispose();
                waveWriter = null;
            }
        }
    }
}
READ ALSO
Смена иконки для неактивной кнопки

Смена иконки для неактивной кнопки

Есть стиль для Button c шаблоном в виде иконки и текста, который применяется к нескольким кнопкам:

271
Конвертирование из object в long

Конвертирование из object в long

Что я делаю не так:

366