admin管理员组

文章数量:1401176

I have written C# code using NAudio, and instead of writing to an actual WAVE file in the file system, I am able to write it to a MemoryStream, which I use later to send to an API. So far, so good.

As my next step, I am trying to send chunks of audio to this API every 10 seconds. I managed to accomplish this by enqueuing my MemoryStream to a ConcurrentQueue and recreating both MemoryStream and writer every 10 seconds.

The code works, but my approach isn't performant enough.

My writer OnDataAvailable() method is shown here:

    void OnDataAvailable(object sender, WaveInEventArgs e)
    {
        if (InvokeRequired)
        {
            //Debug.WriteLine("Data Available");
            BeginInvoke(new EventHandler<WaveInEventArgs>(OnDataAvailable), sender, e);
        }
        else
        {
            //Debug.WriteLine("Flushing Data Available");
            writerMem.Write(e.Buffer, 0, e.BytesRecorded);
            //writer.Write(e.Buffer, 0, e.BytesRecorded);

            int secondsRecorded = (int)(writerMem.Length / writerMem.WaveFormat.AverageBytesPerSecond);

            if (secondsRecorded >= 10)
            {
                memQ.Enqueue(memStream);

                memStream = new MemoryStream();
                writerMem = new WaveFileWriter(memStream, new WaveFormat(44100, 16, 1));
            }
            else
            {
                progressBar1.Value = secondsRecorded;
            }
        }
    }

Is there any better approach to resetting the writer and the MemoryStream where data is written to?

本文标签: cNAudio resetting WaveFileWriter at every 10sStack Overflow