2014-10-17 86 views
2

我試圖通過來自WebRTC的PeerConnection通過getUserMedia()獲取並通過Web Audio API進行更改的音頻。 Web Audio API和WebRTC似乎有能力做到這一點,但我無法理解如何做到這一點。在Web Audio API中,AudioContext對象包含一個方法createMediaStreamSource(),該方法提供了連接由getUserMedia()獲取的MediaStream的方法。此外,還有一個createMediaStreamDestination()方法,它似乎返回具有流屬性的對象。通過PeerConnection發送具有Web音頻效果的MediaStream對象

我從getUserMedia()方法獲取音頻和視頻。我遇到的麻煩是如何將這個流對象(包括音頻和視頻)傳遞給這些方法(例如:createMediaStreamSource())?我是否首先需要從流中提取音頻(getAudioTracks),並找到一種方法將其與視頻結合起來?或者我按原樣傳遞它,並且它不影響視頻?音頻只能改變一次(在添加到PeerConnection之前)?

+0

根據W3C的工作草案,createMediaStreamSource()需要一個MediaStream對象,並且此對象的第一個AudioMediaStreamTrack將用作音頻源。但是,createMediaStreamDestination()方法表示只有一個AudioMediaStreamTrack的MediaStream對象。我會做更多的研究,並希望提供一個答案。 – chRyNaN 2014-10-18 01:10:50

回答

3

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中運行。

參考

2

@android學生的反應良好,按照目前的規格 - 但是,也有在執行與Firefox和Chrome的問題規格。

最後我在Chrome中檢查過,它不能通過WebAudio處理WebRTC的輸出,而Firefox可以。

但是,有兩個漏洞阻止Firefox在PeerConnection中使用WebAudio生成的源碼流,其中一個現在已經在Nightly & Aurora中修復,另一個應該很快。但是,Firefox尚未實現stream.addTrack,這是另一個複雜因素。 Chrome顯然可以處理PeerConnection中的WebAudio源流。

+0

我提供的代碼似乎在Chrome中工作,但是,您對Firefox尚未實現stream.addTrack的說法是正確的。我試圖找到解決方法,但似乎不太可能。希望更多MediaStream API方法的實現將很快在Firefox中提供。 – chRyNaN 2014-10-22 15:47:08