簡體   English   中英

跨瀏覽器的麥克風訪問

[英]cross-browser Microphone access

我正在尋找一種解決方案,以允許網站訪問和處理來自用戶麥克風的音頻流。 對我來說這是陌生的領域。 我一直在使用webRTC示例,但到目前為止,僅在以下方面起作用:運行Sierra的2011 mac air上的firefox和chrome。 Windows 10上的Firefox。

我的腳本在其他瀏覽器/操作系統組合上引發了錯誤,並且某些錯誤不會,但是不管它是否起作用。

有更好的解決方案嗎?

!function(t,e){
  "use strict";
  t.AudioContext = t.AudioContext||t.webkitAudioContext,
  t.OfflineAudioContext = t.OfflineAudioContext||t.webkitOfflineAudioContext;

  var o=AudioContext.prototype,
  r=new AudioContext,n=function(t,e){
    return void 0===t&&void 0!==e
  },
  c=r.createBufferSource().constructor.prototype;
  if(n(c.start,c.noteOn)||n(c.stop,c.noteOff)){
    var i=o.createBufferSource;
    o.createBufferSource=function(){
      var t=i.call(this);
      return t.start=t.start||t.noteOn,t.stop=t.stop||t.noteOff,t
    }
  }
  if("function"==typeof r.createOscillator){
    var a=r.createOscillator().constructor.prototype;
    if(n(a.start,a.noteOn)||n(a.stop,a.noteOff)){
      var s=o.createOscillator;o.createOscillator=function(){
        var t=s.call(this);
        return t.start=t.start||t.noteOn,t.stop=t.stop||t.noteOff,t
      }
    }
  }
  if(void 0===o.createGain&&void 0!==o.createGainNode&&(o.createGain=o.createGainNode),void 0===o.createDelay&&void 0!==o.createDelayNode&&(o.createDelay=o.createGainNode),void 0===o.createScriptProcessor&&void 0!==o.createJavaScriptNode&&(o.createScriptProcessor=o.createJavaScriptNode),-1!==navigator.userAgent.indexOf("like Mac OS X")){
  var u=AudioContext;t.AudioContext=function(){
    function t(){
      r.start(0),r.connect(n),n.connect(e.destination)
    }
    var e=new u,
    o=document.body,
    r=e.createBufferSource(),
    n=e.createScriptProcessor(256,1,1);
    return o.addEventListener("touchstart",t,!1),n.onaudioprocess=function(){ 
        r.disconnect(),
        n.disconnect(),
        o.removeEventListener("touchstart",t,!1),
        n.onaudioprocess=null
      },e
    }
  }
}(window);

var context, analyser, gUM, dataArray, bufferLength, connect_source;
        if (AudioContext){
            context = new AudioContext();
            analyser = context.createAnalyser();

            function success(stream){
                // Create a new volume meter and connect it.
                var source = context.createMediaStreamSource(stream);
                compressor = context.createDynamicsCompressor();
                compressor.threshold.value = -50;
                compressor.knee.value = 40;
                compressor.ratio.value = 12;
                compressor.reduction.value = -20;
                compressor.attack.value = 0;
                compressor.release.value = 0.25;

                filter = context.createBiquadFilter();
                filter.Q.value = 8.30;
                filter.frequency.value = 355;
                filter.gain.value = 3.0;
                filter.type = 'bandpass';
                filter.connect(compressor);

                source.connect( filter );
                source.connect(analyser);

                analyser.fftSize = 512;
                bufferLength = analyser.frequencyBinCount; // half the FFT value
                dataArray = new Uint8Array(bufferLength); // create an array to store the data
            };
            function fail(e){
      if(e){}
      console.log(e);
      aizuchi.error();
    };
            var select = document.getElementById("AudioSourceSelect");
            function generateSelector(devices){
                while(select.firstChild) select.removeChild(select.firstChild);
                var opt;
                for(var l = devices.length; l--;){
                    console.log(devices[l]);
                    if(devices[l].kind == "audioinput"){
                        opt = document.createElement("option")
                        opt.text = devices[l].label
                        opt.value = devices[l].deviceId
                        if(devices[l].deviceId == "default") opt.setAttribute("selected","")
                        select.appendChild( opt );
                    }
                }
                select.onchange = function(){
                    connect_source(this.value);
                }
                select.onchange();
            }
            try {
                    navigator.mediaDevices.enumerateDevices().then(generateSelector)
            } catch(e){
                fail(e);
            }
            connect_source = function(audioSource){
        try {
                    if(Modernizr.getusermedia){
                        gUM = Modernizr.prefixed('getUserMedia', navigator);

                        gUM({video:false, audio : {deviceId: audioSource ? {exact: audioSource} : undefined}},success,fail);
                    } else {
                        navigator.mediaDevices.getUserMedia({video:false, audio : {deviceId: audioSource ? {exact: audioSource} : undefined}}).then(success,fail);
                    }
        } catch(e){
        fail(e);
        }
            }
        }

嘗試

var AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();

看來瀏覽器尚未統一這一語法。

資料來源: MDN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM