Safari 中不存在 Analyser.getFloatTimeDomainData()

Posted

技术标签:

【中文标题】Safari 中不存在 Analyser.getFloatTimeDomainData()【英文标题】:Analyser.getFloatTimeDomainData() does not exist in Safari 【发布时间】:2019-01-14 13:17:53 【问题描述】:

显然 Safari 的 Analyzer 节点没有 getFloatTimeDomainData 方法Here you can see the error。我正在寻找一个类似的功能,将当前波形或时域数据复制到 Float32Array 中,并将在 safari 的浏览器上运行。

window.AudioContext = window.AudioContext || window.webkitAudioContext;
var buflen = 1024;
var buf = new Float32Array( buflen );
audioContext = new AudioContext();
MAX_SIZE = Math.max(4,Math.floor(audioContext.sampleRate/5000));
navigator.getUserMedia = navigator.getUserMedia ||
                   navigator.webkitGetUserMedia ||
                   navigator.mozGetUserMedia ||
                   navigator.msGetUserMedia;

navigator.mediaDevices.getUserMedia(audio: true)
        .then(function(stream) 
      gotStreamPre(stream);
    );

 function gotStreamPre(stream) 
  // Create an AudioNode from the stream.
  mediaStreamSource = audioContext.createMediaStreamSource(stream);
  // Connect it to the destination.
  analyser = audioContext.createAnalyser();
  analyser.fftSize = 2048;
  mediaStreamSource.connect( analyser );
  updatePitchPre();
 

function updatePitchPre( time ) 
  if(analyser!=null)
     var cycles = new Array;
     analyser.getFloatTimeDomainData( buf );//not working on Safari
     var ac = autoCorrelatePre( buf , audioContext.sampleRate );
  if (ac > -1) 

    
  if (!window.requestAnimationFrame)
       window.requestAnimationFrame = window.webkitRequestAnimationFrame;
       rafID = window.requestAnimationFrame( updatePitchPre );
   

【问题讨论】:

developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/… 听起来像是支持 safari,不过(移动设备除外)。您能否添加有关“不工作”的更多信息?到底发生了什么? @briosheje 我在我的问题中添加了 Unhandled Promise Rejection 错误。 尝试用audioContext = new (window.AudioContext || window.webkitAudioContext)();替换audioContext = new AudioContext(); @briosheje 但我有它...第一行 你编辑了原代码,原来是audioContext = new AudioContext();,我可以在编辑历史中看到。如果这样不起作用,您能否添加:console.log(analyser) 【参考方案1】:

我有同样的问题,你可以添加这个:

if (analyser && !analyser.getFloatTimeDomainData) 
    var r = new Uint8Array(2048);
    analyser.getFloatTimeDomainData = function(e) 
        analyser.getByteTimeDomainData(r);
        for (var t = 0, o = e.length; o > t; t++) e[t] = .0078125 * (r[t] - 128)
    

【讨论】:

你能解释一下为什么使用这些特定的数字吗? .0078125128,好吗?

以上是关于Safari 中不存在 Analyser.getFloatTimeDomainData()的主要内容,如果未能解决你的问题,请参考以下文章

固定定位在 Safari 7 中不起作用

HTML5 视频加载数据事件在 IOS Safari 中不起作用

CSS 背景位置在 Mobile Safari (iPhone/iPad) 中不起作用

跨域 Ajax 调用在 Safari 4 和 Safari 5 中不起作用

使用drawRect的Createjs掩码在Safari中不起作用

翻转卡在 Safari 中不显示背面