从麦克风听到传入的音频
我只是想听听我对使用NAudio的麦克风所说的话,这是我的代码到目前为止,但问题是我听不到任何声音。 任何帮助,将不胜感激。
public partial class frmMain : Form { private WaveIn waveIn; // Gets an audio from microphone private WaveOut waveOut; // Sends audio to speaker private BufferedWaveProvider waveProvider; // Gets an audio from stream public frmMain() { InitializeComponent(); } private void frmMain_Load(object sender, EventArgs e) { waveOut = new WaveOut(); waveIn = new WaveIn(); waveProvider = new BufferedWaveProvider(waveIn.WaveFormat); waveOut.Init(waveProvider); waveIn.DataAvailable += waveIn_DataAvailable; waveOut.Play(); } private void waveIn_DataAvailable(object sender, WaveInEventArgs e) { waveProvider.Read(e.Buffer, 0, e.BytesRecorded); } private void btnStop_Click(object sender, EventArgs e) { waveIn.StopRecording(); waveIn.Dispose(); } private void btnStart_Click(object sender, EventArgs e) { waveIn.StartRecording(); } }
我将在网络编程中使用这种情况,我将数据从麦克风发送到套接字,然后在客户端,BufferedWaveProvider将读取数据,然后将其发送到扬声器。 如果有更好的方法,请另外发表评论。
TIA
承诺的示例代码。 代码用于具有两个按钮(名为StartBtn和StopBtn)的表单。
public partial class Form1 : Form { private WaveIn waveIn = null; private BufferedWaveProvider waveProvider = null; private WaveOut waveOut = null; public Form1() { InitializeComponent(); } private void StartBtn_Click(object sender, EventArgs e) { if (waveIn != null) return; // create wave input from mic waveIn = new WaveIn(this.Handle); waveIn.BufferMilliseconds = 25; waveIn.RecordingStopped += waveIn_RecordingStopped; waveIn.DataAvailable += waveIn_DataAvailable; // create wave provider waveProvider = new BufferedWaveProvider(waveIn.WaveFormat); // create wave output to speakers waveOut = new WaveOut(); waveOut.DesiredLatency = 100; waveOut.Init(waveProvider); waveOut.PlaybackStopped += wavePlayer_PlaybackStopped; // start recording and playback waveIn.StartRecording(); waveOut.Play(); } void waveIn_DataAvailable(object sender, WaveInEventArgs e) { // add received data to waveProvider buffer if (waveProvider != null) waveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded); } private void StopBtn_Click(object sender, EventArgs e) { if (waveIn != null) waveIn.StopRecording(); } void waveIn_RecordingStopped(object sender, StoppedEventArgs e) { // stop playback if (waveOut != null) waveOut.Stop(); // dispose of wave input if (waveIn != null) { waveIn.Dispose(); waveIn = null; } // drop wave provider waveProvider = null; } void wavePlayer_PlaybackStopped(object sender, StoppedEventArgs e) { // stop recording if (waveIn != null) waveIn.StopRecording(); // dispose of wave output if (waveOut != null) { waveOut.Dispose(); waveOut = null; } } }
请特别注意waveIn.BufferMilliseconds
和waveOut.DesiredLatency
设置,以减少延迟时间。
为了压缩网络传输的数据,我建议使用不同的库来处理数据块。 您可能需要调整BufferMilliseconds
值以减少开销并获得更好的压缩率。
使用Opus.NET for C#, Opus Codec看起来是一个合理的选择。
- 如何使用c#通过调用该软件的注册表文件中列出的软件UninstallString来卸载软件但该进程不起作用
- 无法将类型’string’隐式转换为’int’错误
- 打印包含WPF Visual的图像
- 使用单个对象上的reflection调用方法
- 如何确定app.config文件是否存在
- DotNetBrowser FinishLoadingFrameEvent多次使用
- 为什么序列化时会出现“System.StackOverflowException未处理”exception?
- Visual Studio 2010中的重构选项在C#和VB之间有所不同
- ASP.NET AutoPostBack然后返回Back Button很奇怪