2014-04-01 83 views
3

我目前正在寫一個應用程序,使用戶開始使用peerJS通過的WebRTC視頻通話禁用麥克風。現在我希望用戶能夠決定是否要添加音頻,但無需重新啓動呼叫。的WebRTC:後來添加的音頻或使用peerJS

當我看到它 - 根據this answer - 有沒有辦法來控制使用瀏覽器的麥克風。假設我啓動了啓用視頻和音頻的呼叫,我可以將合作伙伴方的視頻元素靜音。我不想這樣做。爲什麼?我想有人可以使用瀏覽器的開發者控制檯並取消靜音視頻元素,從而在不知情的情況下監聽呼叫者。

因此,現在看來,我將不得不如果用戶希望視頻重新調用的合作伙伴,同時激活,視頻和音頻,現在只有我將不得不再次重新調用。

我的問題:有沒有更好的方法來做到這一點?另外,如果接聽電話,有沒有辦法確定它是純視頻還是視頻和音頻?

+0

爲什麼不使用peerjs調用的元數據參數來識別其是音頻呼叫還是視頻呼叫。當然,您在撥打電話時必須設置此參數。 – thunderbird

回答

3

好像你正在尋找的是撤銷訪問麥克風或攝像頭的方式,使數據流停止,指示燈熄滅,如果相機被重新激活,用戶會被提示再次。

按照W3C WebRTC Spec,你應該能夠做到這一點:

腳本可以表明,軌道不再需要其與MediaStreamTrack.stop()法源。當使用源的所有曲目已停止時,該源的給定權限將被吊銷,並且源停止。如果數據是從直播源(例如,麥克風或攝像機)生成的,則用戶代理應該刪除該源的任何活動的「廣播中」指示符。

peerJS API docs存在stop()方法中沒有提及,但你應該能夠調用它的瀏覽器的WebRTC實現,使用您傳遞給peerJS的call()功能,我稱之爲流stream

var s = function(t) { 
    t.stop(); 
} 
stream.getAudioTracks().map(s); 

這應該會導致瀏覽器撤消音頻訪問。

不過,我不會太在意留在用戶的瀏覽器開放的WebRTC連接的安全性。如果有人能夠入侵瀏覽器,他們已經可以訪問用戶的未加密密碼,並且無論如何都會啓用相機指示器(如果可用)。

祝你好運!

+0

謝謝你的回答,雖然不是我想要的(我的不好)。看到我的答案上面的解決方案正在爲我工​​作。最起碼到現在。將不得不做進一步的測試。 –

1

無意間我發現this blog post from Mozilla。有趣的部分從標題「靜音音頻和視頻流」開始。在這裏你會發現下面這行代碼:

mediaStream.getVideoTracks()[0].enabled = !(mediaStream.getVideoTracks()[0].enabled); 

這基本上意味着你可以禁用視頻軌道。事實證明,同樣是可能的:

mediaStream.getAudioTracks()[0].enabled = false; 

這將使音頻流靜音。如果這是適用於localStream像這樣:

Participant.prototype.startCall = function(){ 

    var participant = this; 

    var target = participant.callees[0]; 

    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia; 

    navigator.getUserMedia({ 
      audio: true, 
      video: true 
    },function(stream){ 
      console.log("called"); 
      //IMPORTANT LINE HERE 
      stream.getAudioTracks()[0].enabled = false; 
      participant.localStream = stream; 
      participant.call = participant.peer.call(target, stream); 
    },function(error){ 
      console.log(error); 
    }); 
}; 

它似乎禁用音頻流。正如你可以看到我存儲localStream作爲我的對象的屬性和我後來能夠通過使用

myObj.localStream.getAudioTracks()[0].enabled = true; 

就激活音頻流,我可以判斷你不能做對remoteStream相同的操作。但我將不得不通過進一步的測試來驗證這一點。

+0

我通過發送來自連接對等體的消息(如'enable-audio'和'disable-audio')來切換遠程流上的音頻,然後相應地使用'stream.getAudioTracks()[0] .enabled'。 我想音頻不會傳播給同伴時,它被禁用,但我還沒有能夠測量數據傳輸。 – Bert