【音】analyserNode web上如何获取麦克风的频率数据

这样的效果其实早就可以实现,昨天有同事问道,抽空整理了下,大家要注意一下几点

  • AudioContext
  • createGain()方法
  • createMediaStreamSource(stream)
  • createAnalyser() 分析器

先看下demo 地址
在这里插入图片描述
全部的代码

 window.AudioContext = window.AudioContext || window.webkitAudioContext;
  var audioContext = new AudioContext();
  var inputPoint = null, zeroGain = null, analyserNode;
  var str =""
  function updateWave() {
    var freqByteData = new Uint8Array(analyserNode.frequencyBinCount);
        analyserNode.getByteFrequencyData(freqByteData);
    var multiplier = analyserNode.frequencyBinCount
    str= ""
    for(let i =0; i<500; i++) {
      str+= '<span>'+freqByteData[i]+'</span>'
    }
    document.getElementById('arrlist').innerHTML = str
    window.requestAnimationFrame(updateWave);
  }

  var handleSuccess = function(stream) {
    var audioContext = new AudioContext();
    inputPoint = audioContext.createGain();
    var realAudioInput = audioContext.createMediaStreamSource(stream);
    realAudioInput.connect(inputPoint);
    analyserNode = audioContext.createAnalyser();
    analyserNode.fftSize = 2048;
    inputPoint.connect( analyserNode );
    updateWave()
  };
  navigator.mediaDevices.getUserMedia({ audio: true, video: false })
      .then(handleSuccess)

有疑问的欢迎一块讨论

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
获取麦克风频率需要使用频处理的知识,可以通过以下步骤实现: 1. 使用C#中的NAudio库来获取麦克风频流。 2. 将频流转换成数据,可以使用NAudio库提供的WaveBuffer类。 3. 对数据进行快速傅里叶变换(FFT),可以使用NAudio库提供的FFT类。 4. 获取数据的频谱信息,可以通过FFT计算得到。 5. 根据频谱信息计算出频的频率。 以下是获取麦克风频率的代码示例: ```csharp using NAudio.Wave; using System.Numerics; //创建一个录机对象 var recorder = new WaveInEvent(); //设置录机的参数 recorder.WaveFormat = new WaveFormat(44100, 1); //开启录机 recorder.StartRecording(); //定义一个缓冲区,用于存储数据 byte[] buffer = new byte[recorder.WaveFormat.BlockAlign]; while (true) { //读取录机中的数据 recorder.Read(buffer, 0, buffer.Length); //将数据转换成WaveBuffer对象 var waveBuffer = new WaveBuffer(buffer); //对数据进行FFT变换 var fft = new FFT(); Complex[] result = fft.Transform(waveBuffer.FloatBuffer); //获取数据的频谱信息 float[] spectrum = new float[result.Length]; for (int i = 0; i < result.Length; i++) { spectrum[i] = (float)(result[i].Magnitude); } //计算频的频率 float maxFrequency = 0; float maxAmplitude = 0; for (int i = 0; i < spectrum.Length; i++) { float amplitude = spectrum[i]; if (amplitude > maxAmplitude) { maxFrequency = (float)i / (float)spectrum.Length * recorder.WaveFormat.SampleRate; maxAmplitude = amplitude; } } //输出频的频率 Console.WriteLine("Frequency: " + maxFrequency); } ``` 需要注意的是,以上代码只是一个简单的示例,实际应用中还需要进行优化,例如对数据进行预处理、滤波等,以提高频率计算的准确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值