来自麦克风迭代结果的缓冲流

Posted

技术标签:

【中文标题】来自麦克风迭代结果的缓冲流【英文标题】:Buffer stream from microphone iterating results 【发布时间】:2020-02-28 16:04:52 【问题描述】:

我想做的是,不断地听麦克风,让麦克风写入器写入流,当流具有 x 长度时,产生结果,清除流并继续循环执行。 然后从调用方分析收到的所有字节,我对麦克风录音有点陌生,我不知道下面的代码是否注册了一些东西,我正在使用 NAudio 库:

这是来电者:

var buffers = service.StreamHearing();
foreach (var buffer in buffers)

    //analyse

然后才是真正的服务:

public IEnumerable<byte[]> StreamHearing()
    
        var buffer = new byte[512];
        using(var stream = new MemoryStream(buffer))
        using(var writer = new WaveFileWriter(new IgnoreDisposeStream(stream), new WaveFormat(44100, 1)))
        
            var recorder = new WaveInEvent
            
                WaveFormat = new WaveFormat(44100, 1),
                BufferMilliseconds = 100
            ;

            recorder.StartRecording();
            while (true)
            
                yield return buffer;
                buffer = new byte[512];
                stream.SetLength(0);
            
        
    

这不起作用,请帮我看看如何做。 谢谢

【问题讨论】:

【参考方案1】:

您需要了解一些您错过的事情。 首先,WaveInEvent 会异步写入来自麦克风的数据。这是将数据从麦克风写入某个流的正确 sn-p:

var buffer = new byte[512];
var recorder = new WaveInEvent

   WaveFormat = new WaveFormat(44100, 1),
   BufferMilliseconds = 100
;
var stream = new MemoryStream(buffer);
var writer = new WaveFileWriter(new IgnoreDisposeStream(stream), recorder.WaveFormat);
recorder.DataAvailable += (source, eventArgs) => 

    var data = eventArgs.Buffer;
    var bytesRead = eventArgs.BytesRecorded;
    //here is a place where data from the microphone will be available
    //you can add your processing right here in case you don't need to record and save the data
    writer.Write(data, 0, bytesRead);
;

waveIn.StartRecording(); 

关于如何处理您收到的数据有多种不同的方式,但我不知道您的主要目标,因此很难说您选择哪种处理方式更好。

【讨论】:

感谢您的回答!我明白你的意思,我完全错过了那一点。我想做的是,永远不要停止录制,并按 x 间隔发送数据进行一些处理,所以这有点像后台作业,以某种方法输入数据。

以上是关于来自麦克风迭代结果的缓冲流的主要内容,如果未能解决你的问题,请参考以下文章

使用 .NET Framework 捕获麦克风音频流

C# 中的麦克风到扬声器音频流

同步处理来自多个线程的数据

获取 16 位和 32 位录制流的音频电平

使用 AudioUnit IOS 从 nsdata 的服务器流播放语音

如何捕获麦克风缓冲区原始数据? [关闭]