createMediaStreamSource()
方法以MediaStream
對象爲參數,然後將該對象的第一個AudioMediaStreamTrack
作爲音頻源使用。即使該對象同時包含音頻和視頻,也可以使用從getUserMedia()
方法收到的MediaStream對象。例如:
var source = context.createMediaStreamSource(localStream);
在哪裏「上下文」,在上面的代碼,是一種AudioContext
對象和「localStream」是()從getUserMedia獲得的MediaStream對象。 createMediaStreamDestination()
方法創建一個目標節點對象,該目標節點對象在其「流」屬性中具有MediaStream對象。此MediaStream對象只包含一個AudioMediaStreamTrack(即使源的輸入流同時包含音頻和視頻或衆多音頻軌道):從源內的流獲取的軌道的更改版本。例如:
var destination = context.createMediaStreamDestination();
現在,然後才能訪問新創建的目標變量的流屬性,必須通過所有節點連接在一起創建音頻圖。對於這個例子,讓我們假設我們有一個BiquadFilter節點命名濾波器:
source.connect(filter);
filter.connect(destination);
然後,我們可以得到從目的地可變流屬性。而這可以用來添加到PeerConnection
對象發送到遠程對等:
peerConnection.addStream(destination.stream);
注:流屬性包含只有改變AudioMediaStreamTrack一個MediaStream對象。因此,沒有視頻。如果你想視頻一併發送,你必須這條賽道添加到包含一個視頻軌道流對象:
var audioTracks = destination.stream.getAudioTracks();
var track = audioTracks[0]; //stream only contains one audio track
localStream.addTrack(track);
peerConnection.addStream(localStream);
請記住,如果有該addTrack
方法將不添加軌道已經在MediaStream對象中具有相同的ID。因此,您可能必須首先刪除源節點中獲取的曲目。
聲音應該可以隨時通過調整中間節點(源和目標之間)的值來改變。這是因爲流在發送到其他對等體之前通過節點。 Check out this example動態改變錄製聲音的效果(對於流應該是相同的)。注意:我還沒有測試過這個代碼。雖然它在理論上有效,但由於Web Audio API和WebRTC都處於工作草案階段並且尚未標準化,因此可能存在一些跨瀏覽器問題。我認爲它可以在Mozilla Firefox和Google Chrome中運行。
參考
根據W3C的工作草案,createMediaStreamSource()需要一個MediaStream對象,並且此對象的第一個AudioMediaStreamTrack將用作音頻源。但是,createMediaStreamDestination()方法表示只有一個AudioMediaStreamTrack的MediaStream對象。我會做更多的研究,並希望提供一個答案。 – chRyNaN 2014-10-18 01:10:50