Создание волнового файла с помощью Naudio - PullRequest
0 голосов
/ 22 февраля 2020

Я записал звук компьютера (не mi c input) и сделал его волновым файлом (.wav) с помощью wasapicapture в Naudio. Я думал, что это нормально. Я сделал двоичный файл для анализа волнового файла, но структура не является стандартной структурой файла .wav.

Пример стандартной структуры

Результат моей программы

Это должно быть похоже на первое.

Это часть записи звука.

private IWaveIn waveIn;
    private WaveFileWriter writer;
    private string outputFilename;
    private string outputtextname;
    private readonly string outputFolder;
    private byte[] audiobyte;

    public Form1()
    {
        InitializeComponent();
        Disposed += OnRecordingPanelIDispose;
        outputFolder = Application.StartupPath + "\\Temp";
        Directory.CreateDirectory(outputFolder);
    }

    void OnRecordingPanelIDispose(object sender, EventArgs e)
    {
        Cleanup();
    }

    private void Cleanup()
    {
        if (waveIn != null)
        {
            waveIn.Dispose();
            waveIn = null;
        }
        FinalizeWaveFile();
    }
    private void FinalizeWaveFile()
    {
        if (writer != null)
        {
            writer.Dispose();
            writer = null;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (waveIn == null)
        {
            CreateWaveInDevice();
        }
        outputFilename = string.Format("TestRecord{0:yyy-mm-dd hh-mm-ss}.wav", DateTime.Now);
        writer = new WaveFileWriter(Path.Combine(outputFolder, outputFilename), waveIn.WaveFormat);
        waveIn.StartRecording();
        SetControlState(true);
    }

    private void CreateWaveInDevice()
    {
        waveIn = new WasapiLoopbackCapture();
        waveIn.DataAvailable += OnDataAvaliable;
        waveIn.RecordingStopped += OnRecordingStopped;
    }

    void OnDataAvaliable(object sender, WaveInEventArgs e)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new EventHandler<WaveInEventArgs>(OnDataAvaliable), sender, e);
        }
        else
        {
            writer.Write(e.Buffer, 0, e.BytesRecorded);
            //int SecondsRecorded = (int)(writer.Length / writer.WaveFormat.AverageBytesPerSecond);
        }
    }

    void OnRecordingStopped(object sender, StoppedEventArgs e)
    {
        if (InvokeRequired)
        {
            BeginInvoke(new EventHandler<StoppedEventArgs>(OnRecordingPanelIDispose), sender, e);
        }
        else
        {
            FinalizeWaveFile();
            if (e.Exception != null)
            {
                MessageBox.Show(string.Format($"Error{e.Exception.Message}"));
            }

            int newItemIndex = listBox1.Items.Add(outputFilename);
            listBox1.SelectedIndex = newItemIndex;
            SetControlState(false);
        }
    }


    private void button2_Click(object sender, EventArgs e)
    {
        StopRecording();
    }
    void StopRecording()
    {
        Debug.WriteLine("Stop Recording");
        if (waveIn != null) waveIn.StopRecording();
    }
    private void SetControlState(bool isRecording)
    {
        button1.Enabled = !isRecording;
        button2.Enabled = isRecording;
    }

На самом деле я сослался на https://www.youtube.com/watch?v=k_tt4j_LbGA.

...