Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言录制来自麦克风和扬声器的音频#_C#_Naudio - Fatal编程技术网

C# 用C语言录制来自麦克风和扬声器的音频#

C# 用C语言录制来自麦克风和扬声器的音频#,c#,naudio,C#,Naudio,我正在构建一个应用程序,将麦克风和扬声器中的音频录制到文件(.wav)中。我希望我的应用程序将数据从麦克风和扬声器写入同一个合并文件。我很难同时保存合并的文件。它只为麦克风节省了时间 这是我的代码: using NAudio.Wave; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.

我正在构建一个应用程序,将麦克风和扬声器中的音频录制到文件(.wav)中。我希望我的应用程序将数据从麦克风和扬声器写入同一个合并文件。我很难同时保存合并的文件。它只为麦克风节省了时间

这是我的代码:

using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Test_Recorder
{
    public partial class Form2 : Form
    {
        private WaveIn recorder;
        private BufferedWaveProvider bufferedWaveProvider;
        private SavingWaveProvider savingWaveProvider;
        private WaveOut player;
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            StartRecording();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            StopRecording();
        }
        public void StartRecording()
        {
            // set up the recorder
            recorder = new WaveIn();
            //recorder = new WasapiLoopbackCapture();
            //recorder = new WaveIn();
            recorder.DataAvailable += RecorderOnDataAvailable;

            // set up our signal chain
            bufferedWaveProvider = new BufferedWaveProvider(recorder.WaveFormat);
            savingWaveProvider = new SavingWaveProvider(bufferedWaveProvider, Guid.NewGuid() + ".wav");

            // set up playback
            player = new WaveOut();
            player.Init(savingWaveProvider);
            player.Volume = 1;
            // begin playback & record
            player.Play();
            recorder.StartRecording();
        }
        public void StopRecording()
        {
            // stop recording
            recorder.StopRecording();
            // stop playback
            player.Stop();
            // finalise the WAV file
            savingWaveProvider.Dispose();
        }
        private void RecorderOnDataAvailable(object sender, WaveInEventArgs waveInEventArgs)
        {
            bufferedWaveProvider.AddSamples(waveInEventArgs.Buffer, 0, waveInEventArgs.BytesRecorded);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //rec.BeginRecording();
            Form3 frm = new Form3();
            this.Hide();
            frm.Show();
        }
    }


    class SavingWaveProvider : IWaveProvider, IDisposable
    {
        private readonly IWaveProvider sourceWaveProvider;
        private readonly WaveFileWriter writer;
        private bool isWriterDisposed;

        public SavingWaveProvider(IWaveProvider sourceWaveProvider, string wavFilePath)
        {
            this.sourceWaveProvider = sourceWaveProvider;
            writer = new WaveFileWriter(wavFilePath, sourceWaveProvider.WaveFormat);
        }

        public int Read(byte[] buffer, int offset, int count)
        {
            var read = sourceWaveProvider.Read(buffer, offset, count);
            if (count > 0 && !isWriterDisposed)
            {
                writer.Write(buffer, offset, read);
            }
            if (count == 0)
            {
                Dispose(); // auto-dispose in case users forget
            }
            return read;
        }

        public WaveFormat WaveFormat { get { return sourceWaveProvider.WaveFormat; } }

        public void Dispose()
        {
            if (!isWriterDisposed)
            {
                isWriterDisposed = true;
                writer.Dispose();
            }
        }
    }
}

如何将扬声器和麦克风保存到同一个文件中?

首先,您不能将两个数据流保存到一个已打开的文件中。您需要创建两个独立的内存流,并使用一些奇特的魔法dll将它们连接起来:),然后您可以使用StreamWriter或其他文件写入方法将这一个内存流保存到文件中

为了省去你的谷歌搜索,我发现这段代码可能会帮你解决你的问题,除此之外


再来一个提示。更好的做法是使用“using”子句,然后调用Dispose。

最简单的方法可能是将两者保存到单独的文件中,然后在录制后使用
MixingSampleProvider将它们混合在一起。如果两者都以相同的波形格式(采样率、位深度、通道计数)记录,这将是最简单的方法。

感谢您的回复。你能给我一个示例代码吗。这对我来说是件好事。提前谢谢。