从naudio.Wave.WaveIn到Stream?
我复制了这段代码,我不明白,但我知道它完成后它会做什么(输出 – sourceStream)…
NAudio.Wave.WaveIn sourceStream = null; NAudio.Wave.DirectSoundOut waveOut = null; NAudio.Wave.WaveFileWriter waveWriter = null; sourceStream = new NAudio.Wave.WaveIn(); sourceStream.DeviceNumber = 2; sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(16000, NAudio.Wave.WaveIn.GetCapabilities(2).Channels); NAudio.Wave.WaveInProvider waveIn = new NAudio.Wave.WaveInProvider(sourceStream); waveOut = new NAudio.Wave.DirectSoundOut(); waveOut.Init(waveIn); //sourceStream.DataAvailable. sourceStream.StartRecording(); waveOut.Play(); sourceStream.StopRecording();
据我所知,此代码记录来自所选麦克风的声音并为其提供输出(sourceStream)
所以我需要的第一件事是 – >我如何从这段代码中获取流(喜欢而不是WaveIn a Stream [从WaveIn转换为Stream])?
请你们解释一下代码……我试过NAudio网站的解释,但我不明白 – >我是音频和流媒体的初学者……
您需要捕获DataAvailable
提供的DataAvailable
event
,类似这样
//Initialization of the event handler for event DataAvailable sourceStream.DataAvailable += new EventHandler(sourceStream_DataAvailable);
并提供event handler
,您需要的数据位于event handler
的WaveInEventArgs
输入参数中。 请注意,音频的数据类型很short
所以我通常会这样做,
private void sourceStream_DataAvailable(object sender, WaveInEventArgs e) { if (sourceStream == null) return; try { short[] audioData = new short[e.Buffer.Length / 2]; //this is your data! by default is in the short format Buffer.BlockCopy(e.Buffer, 0, audioData, 0, e.Buffer.Length); float[] audioFloat = Array.ConvertAll(audioData, x => (float)x); //I typically like to convert it to float for graphical purpose //Do something with audioData (short) or audioFloat (float) } catch (Exception exc) { //if some happens along the way... } }
但是,如果你想转换为byte[]
格式,那么你应该直接使用e.Buffer
或者将它复制到一些不合适的byte[]
。 至于我复制到byte[]
数组然后在其他地方处理它通常更合适,因为WaveIn
流是活的。
byte[] bytes = new short[e.Buffer.Length]; //your local byte[] byteList.AddRange(bytes); //your global var, to be processed by timer or some other methods, I prefer to use List or Queue of byte[] Array
然后将您的byteList
转换为Stream
,您可以简单地使用MemoryStream
并输入byte[]
Stream stream = new MemoryStream(byteList.ToArray()); //here is your stream!
- DryIOC容器配置用于属性注入
- “System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy”类型中的方法“ExecuteAsync”没有实现
- ASP.NET引号字符编码在设置控件的属性时会导致问题
- 如何在使用PrinterDialog时设置纸张类型?
- 如何根据时间或百分比剪切/裁剪/修剪video,并将输出保存在不同的文件中
- C#MySql查询结果为combobox
- 将Base64字符串转换为位图或图像Xamarin或Android
- 褪色声音输入/输出
- 何时使用OrderByCompletion(Jon Skeet)和Parallel.ForEach与异步委托