AudioContext:createMediaStreamSource() 方法

Baseline 已廣泛支援

此特性已得到良好支援,可在多種裝置和瀏覽器版本上使用。自 2021 年 4 月起,所有瀏覽器均已支援此特性。

AudioContext 介面的 createMediaStreamSource() 方法用於建立一個新的 MediaStreamAudioSourceNode 物件,它接收一個媒體流(例如,來自 MediaDevices.getUserMedia 的例項),該媒體流的音訊隨後可以被播放和操作。

有關媒體流音訊源節點(MediaStreamAudioSourceNode)的更多詳細資訊,請參閱 MediaStreamAudioSourceNode 參考頁面。

語法

js
createMediaStreamSource(stream)

引數

stream

一個 MediaStream,用作音訊源,將被饋送到音訊處理圖中以供使用和操作。

返回值

一個新建立的 MediaStreamAudioSourceNode 物件,表示音訊節點,其媒體是從指定的源流中獲取的。

示例

在此示例中,我們從 navigator.getUserMedia 獲取媒體(音訊+影片)流,將媒體饋送到 <video> 元素進行播放然後靜音,但同時也將音訊饋送到 MediaStreamAudioSourceNode。接下來,我們將此源音訊饋送到一個低通 BiquadFilterNode(它有效地充當低音增強器),然後再饋送到 AudioDestinationNode

<video> 元素下方的滑塊控制著低通濾波器的增益量——增加滑塊的值可以使音訊聽起來更具低音感!

注意: 您可以 線上檢視此示例,或 檢視原始碼

js
const pre = document.querySelector("pre");
const video = document.querySelector("video");
const myScript = document.querySelector("script");
const range = document.querySelector("input");

// getUserMedia block - grab stream
// put it into a MediaStreamAudioSourceNode
// also output the visuals into a video element

if (navigator.mediaDevices) {
  console.log("getUserMedia supported.");
  navigator.mediaDevices
    .getUserMedia({ audio: true, video: true })
    .then((stream) => {
      video.srcObject = stream;
      video.onloadedmetadata = (e) => {
        video.play();
        video.muted = true;
      };

      // Create a MediaStreamAudioSourceNode
      // Feed the HTMLMediaElement into it
      const audioCtx = new AudioContext();
      const source = audioCtx.createMediaStreamSource(stream);

      // Create a biquad filter
      const biquadFilter = audioCtx.createBiquadFilter();
      biquadFilter.type = "lowshelf";
      biquadFilter.frequency.value = 1000;
      biquadFilter.gain.value = range.value;

      // connect the AudioBufferSourceNode to the gainNode
      // and the gainNode to the destination, so we can play the
      // music and adjust the volume using the mouse cursor
      source.connect(biquadFilter);
      biquadFilter.connect(audioCtx.destination);

      // Get new mouse pointer coordinates when mouse is moved
      // then set new gain value

      range.oninput = () => {
        biquadFilter.gain.value = range.value;
      };
    })
    .catch((err) => {
      console.log(`The following gUM error occurred: ${err}`);
    });
} else {
  console.log("getUserMedia not supported on your browser!");
}

// dump script to pre element

pre.textContent = myScript.textContent;

注意: 呼叫 createMediaStreamSource() 的後果是,媒體流的音訊播放將被重新路由到 AudioContext 的處理圖中。因此,播放/暫停流仍然可以透過媒體元素 API 和播放器控制元件來完成。

規範

規範
Web Audio API
# dom-audiocontext-createmediastreamsource

瀏覽器相容性

另見