這篇翻譯不完整嚎研。請幫忙從英語翻譯這篇文章。
這是一個實驗中的功能
此功能某些瀏覽器尚在開發(fā)中,請參考瀏覽器兼容性表格以得到在不同瀏覽器中適合使用的前綴胖烛。由于該功能對應(yīng)的標(biāo)準(zhǔn)文檔可能被重新修訂,所以在未來版本的瀏覽器中該功能的語法和行為可能隨之改變诅迷。
RTCPeerConnection接口代表一個由本地計算機到遠端的WebRTC連接佩番。該接口提供了創(chuàng)建,保持罢杉,監(jiān)控趟畏,關(guān)閉連接的方法的實現(xiàn)。
注意:?RTCPeerConnection 和?RTCSessionDescription在不同的瀏覽器中有不同的實現(xiàn)方式滩租。(navigator.getUserMedia()方法也是如此)如果有必要赋秀,則需要考慮在不同瀏覽器的實現(xiàn)利朵。例如:
var PeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;var SessionDescription = window.RTCSessionDescription || window.mozRTCSessionDescription || window.webkitRTCSessionDescription;var GET_USER_MEDIA = navigator.getUserMedia ? "getUserMedia" :? ? ? ? ? ? ? ? ? ? navigator.mozGetUserMedia ? "mozGetUserMedia" :? ? ? ? ? ? ? ? ? ? navigator.webkitGetUserMedia ? "webkitGetUserMedia" : "getUserMedia";var v = document.createElement("video");var SRC_OBJECT = 'srcObject' in v ? "srcObject" :? ? ? ? ? ? ? ? 'mozSrcObject' in v ? "mozSrcObject" :? ? ? ? ? ? ? ? 'webkitSrcObject' in v ? "webkitSrcObject" : "srcObject";
這將提高您的這將提高您的網(wǎng)站或網(wǎng)絡(luò)應(yīng)用的兼容性。Adapter.js提供的代碼解決了瀏覽器兼容性的問題
由于RTCPeerConnection實現(xiàn)了EventTarget?接口沃琅,故其可以接收處理事件哗咆。
構(gòu)造函數(shù)
RTCPeerConnection.RTCPeerConnection()
構(gòu)造函數(shù);創(chuàng)建一個新的RTCPeerConnection對象。
屬性
該接口的屬性繼承了其父接口,?EventTarget.
RTCPeerConnection.canTrickleIceCandidates?只讀
如果遠端支持UDP打洞或支持通過中繼服務(wù)器連接益眉,則該屬性值為true晌柬。否則,為false郭脂。該屬性的值依賴于遠端設(shè)置且僅在本地的?RTCPeerConnection.setRemoteDescription()方法被調(diào)用時有效年碘,如果該方法沒被調(diào)用,則其值為null.
RTCPeerConnection.connectionState?只讀
只讀connectionState屬性通過返回由枚舉RTCPeerConnectionState指定的字符串值之一來指示對等連接的當(dāng)前狀態(tài)展鸡。
RTCPeerConnection.currentLocalDescription?只讀
只讀屬性RTCPeerConnection.currentLocalDescription返回一個描述連接本地端的RTCSessionDescription對象屿衅,因為自上次RTCPeerConnection完成協(xié)商并連接到遠程對等體之后,它最近成功協(xié)商莹弊。 還包括可能已經(jīng)由ICE代理生成的任何ICE候選者的列表涤久,因為首先被描述的描述所表示的要約或答案。
RTCPeerConnection.currentRemoteDescription?只讀
只讀屬性RTCPeerConnection.currentRemoteDescription返回一個RTCSessionDescription對象忍弛,描述連接的遠程端响迂,因為最近一次RTCPeerConnection完成協(xié)商并連接到遠程對等體后最近成功協(xié)商。 還包括可能已經(jīng)由ICE代理生成的任何ICE候選者的列表细疚,因為首先被描述的描述所表示的要約或答案蔗彤。
RTCPeerConnection.defaultIceServers?只讀
只讀屬性RTCPeerConnection.defaultIceServers根據(jù)RTCIceServer字典返回一個對象數(shù)組,該字典指示如果在RTCConfiguration中沒有提供給RTCPeerConnection的默認(rèn)情況下疯兼,瀏覽器將使用ICE服務(wù)器然遏。 然而,瀏覽器根本不需要提供任何默認(rèn)的ICE服務(wù)器吧彪。
RTCPeerConnection.iceConnectionState?只讀
只讀屬性RTCPeerConnection.iceConnectionState返回與RTCPeerConnection關(guān)聯(lián)的ICE代理的狀態(tài)類型為RTCIceConnectionState的枚舉待侵。
RTCPeerConnection.iceGatheringState?只讀
只讀屬性,返回一個RTCIceGatheringState類型的結(jié)構(gòu)體姨裸,它描述了連接的ICE收集狀態(tài)
RTCPeerConnection.idpLoginUrl?只讀
blah
RTCPeerConnection.localDescription?只讀
只讀屬性诫给,返回一個?RTCSessionDescription?,它描述了這條連接的本地端的會話控制(用戶會話所需的屬性以及配置信息)啦扬。如果本地的會話控制還沒有被設(shè)置中狂,它的值就會是null。
RTCPeerConnection.peerIdentity?只讀
只讀屬性扑毡,返回一個RTCIdentityAssertion,它由一組信息構(gòu)成胃榕,包括一個域名(idp)以及一個名稱(name),它們代表了這條連接的遠端機器的身份識別信息。如果遠端機器還沒有被設(shè)置以及校驗勋又,這個屬性會返回一個null值苦掘。一旦被設(shè)置,它不能被一般方法改變楔壤。
RTCPeerConnection.pendingLocalDescription?只讀
blah
RTCPeerConnection.pendingRemoteDescription?只讀
blah
RTCPeerConnection.remoteDescription?只讀
blah
blah
RTCPeerConnection.signalingState?只讀
返回一個RTC通信狀態(tài)的結(jié)構(gòu)體鹤啡,這個結(jié)構(gòu)體描述了本地連接的通信狀態(tài)。這個 狀態(tài)描述了一個定義連接配置的SDP offer蹲嚣。它包含了下列信息递瑰,與MediaStream類型本地相關(guān)的對象的描述,媒體流編碼方式或RTP和 ?RTCP協(xié)議的選項?隙畜,以及被ICE服務(wù)器收集到的candidates(連接候選者)抖部。當(dāng)RTCPeerConnection.signalingState的值改變時,對象上的signalingstatechange事件會被觸發(fā)议惰。
基本用法
一個基本的RTCPeerConnection使用需要協(xié)調(diào)本地機器以及遠端機器的連接慎颗,它可以通過在兩臺機器間生成Session Description的數(shù)據(jù)交換協(xié)議來實現(xiàn)。呼叫方發(fā)送一個offer(請求)言询,被呼叫方發(fā)出一個answer(應(yīng)答)來回答請求俯萎。雙方-呼叫方以及被呼叫方,最開始的時候都要建立他們各自的RTCPeerConnection對象运杭。
var pc = new RTCPeerConnection();pc.onaddstream = function(obj) {? var vid = document.createElement("video");? document.appendChild(vid);? vid.srcObject = obj.stream;}// Helper functionsfunction endCall() {? var videos = document.getElementsByTagName("video");? for (var i = 0; i < videos.length; i++) {? ? videos[i].pause();? }? pc.close();}function error(err) { endCall(); }
呼叫初始化
如果你是呼叫方夫啊,你需要初始化一個連接
// Get a list of friends from a server// User selects a friend to start a peer connection withnavigator.getUserMedia({video: true}, function(stream) {? pc.onaddstream({stream: stream});? // Adding a local stream won't trigger the onaddstream callback? pc.addStream(stream);? pc.createOffer(function(offer) {? ? pc.setLocalDescription(new RTCSessionDescription(offer), function() {? ? ? // send the offer to a server to be forwarded to the friend you're calling.? ? }, error);? }, error);}
呼叫回答
在另一端,你的朋友會從服務(wù)器收到offer信息县习。
var offer = getOfferFromFriend();navigator.getUserMedia({video: true}, function(stream) {? pc.onaddstream({stream: stream});? pc.addStream(stream);? pc.setRemoteDescription(new RTCSessionDescription(offer), function() {? ? pc.createAnswer(function(answer) {? ? ? pc.setLocalDescription(new RTCSessionDescription(answer), function() {? ? ? ? // send the answer to a server to be forwarded back to the caller (you)? ? ? }, error);? ? }, error);? }, error);}
處理應(yīng)答
同時在呼叫發(fā)起方,你會收到這個應(yīng)答(前面被呼叫方發(fā)出的answer)谆趾,你需要將它設(shè)置為你的遠端連接躁愿。
// pc was set up earlier when we made the original offervar offer = getResponseFromFriend();pc.setRemoteDescription(new RTCSessionDescription(offer), function() { }, error);
屬性
這個接口從它的父元素中繼承屬性,?EventTarget.
RTCPeerConnection.iceConnectionState?只讀
返回一個RTCIceConnectionState類型的結(jié)構(gòu)體,這個結(jié)構(gòu)體描述了連接的ICE連接狀態(tài)沪蓬。當(dāng)這個狀態(tài)的值改變時彤钟,這個對象會觸發(fā)一個iceconnectionstatechange?事件。狀態(tài)可能存在的值如下:
"new": ICE服務(wù)器正在收集地址或正在等待遠端的candidates(這兩種情況可能同時存在)跷叉。
"checking": ICE服務(wù)器找到了遠端的candidates(連接候選者),這些candidates至少有一個逸雹,同時ICE服務(wù)器在檢測這些candidates,盡管它可能還沒有找到連接云挟。此刻梆砸,ICE服務(wù)器可能仍在收集candidates(連接候選者)。
"connected": ICE服務(wù)器已經(jīng)找到了一條可用的適合所有組件的連接园欣,但它仍然在測試更多的遠端candidate以提供更好的連接帖世。同時,ICE服務(wù)器可能仍在收集candidates沸枯。
"completed": ICE服務(wù)器已經(jīng)找到了一條可用的連接日矫,并不再測試遠端candidates赂弓。
"failed": ICE服務(wù)器已經(jīng)檢測了所有的遠端candidates,但并沒有找到可用的哪轿。對一些組件適用的連接可能已經(jīng)被找到盈魁。
"disconnected": 至少一個組件的活躍度檢查失敗了,這可能是由糟糕的網(wǎng)絡(luò)環(huán)境造成的一個短期狀態(tài)窃诉,它可以被它自身所修復(fù)杨耙。
"closed": ICE服務(wù)器已經(jīng)關(guān)閉,并不再響應(yīng)請求褐奴。
RTCPeerConnection.iceGatheringState?只讀
返回一個iceGatheringState類型的結(jié)構(gòu)體按脚,它描述了這條連接的ICE收集狀態(tài)。該狀態(tài)可能取以下的值:
"new": 對象剛剛被創(chuàng)建,還沒有網(wǎng)絡(luò)化敦冬。
"gathering": ICE引擎正在為連接收集candidates(連接候選者)辅搬。
"complete": 引擎已經(jīng)完成了candidates收集。但像添加一個新的接口或者一個新的turn服務(wù)器這些事件會導(dǎo)致狀態(tài)回到"gathering"脖旱。
RTCPeerConnection.localDescription?只讀
返回一個?RTCSessionDescription?堪遂,它描述了這條連接的本地端的會話控制(用戶會話所需的屬性以及配置信息)。如果本地的會話控制還沒有被設(shè)置萌庆,它的值就會是null溶褪。
RTCPeerConnection.peerIdentity?只讀
返回一個RTCIdentityAssertion,它由一組信息構(gòu)成,包括一個域名(idp)以及一個名稱(name)践险,它們代表了這條連接的遠端機器的身份識別信息猿妈。如果遠端機器還沒有被設(shè)置以及校驗,這個屬性會返回一個null值巍虫。一旦被設(shè)置彭则,它不能被一般方法改變。
RTCPeerConnection.remoteDescription?只讀
返回一個?RTCSessionDescription?它描述了這條連接的遠端機器的會話控制占遥,如果遠端機器還未被設(shè)置俯抖,它的值會是null。
RTCPeerConnection.signalingState?只讀
返回一個RTC通信狀態(tài)的結(jié)構(gòu)體瓦胎,這個結(jié)構(gòu)體描述了本地連接的通信狀態(tài)芬萍。這個 狀態(tài)描述了一個定義連接配置的SDP offer。它包含了下列信息搔啊,與MediaStream類型本地相關(guān)的對象的描述柬祠,媒體流編碼方式或RTP和 ?RTCP協(xié)議的選項?,以及被ICE服務(wù)器收集到的candidates(連接候選者)负芋。當(dāng)RTCPeerConnection.signalingState的值改變時瓶盛,對象上的signalingstatechange事件會被觸發(fā)。?它可能取下列的值:
"stable": 沒有SDP offer/answer正在被交換,連接仍然處于初始化狀態(tài)惩猫。
"have-local-offer": 這條連接的本地端機器已經(jīng)本地應(yīng)用了一個SDP offer芝硬。
"have-remote-offer": 這條連接的遠端機器已經(jīng)本地應(yīng)用了一個SDP offer。
"have-local-pranswer": 一個來自遠端的SDP offer已經(jīng)被應(yīng)用轧房,同時一個SDP pranswer在本地被應(yīng)用拌阴。
"have-remote-pranswer":一個本地的SDP offer被應(yīng)用,同時一個SDP pranswer在遠端被應(yīng)用奶镶。
"closed": 連接被關(guān)閉迟赃。
事件處理器
是收到addstream?事件時調(diào)用的事件處理器。?Such an event is 當(dāng)MediaStream?被遠端機器添加到這條連接時厂镇,該事件會被觸發(fā)纤壁。?當(dāng)調(diào)用RTCPeerConnection.setRemoteDescription()方法時,這個事件就會被立即觸發(fā)捺信,它不會等待SDP協(xié)商的結(jié)果酌媒。
RTCPeerConnection.ondatachannel
是收到datachannel?事件時調(diào)用的事件處理器。?當(dāng)一個RTCDataChannel?被添加到連接時迄靠,這個事件被觸發(fā)秒咨。
RTCPeerConnection.onicecandidate
是收到?icecandidate?事件時調(diào)用的事件處理器.。當(dāng)一個RTCICECandidate?對象被添加時掌挚,這個事件被觸發(fā)雨席。
RTCPeerConnection.oniceconnectionstatechange
是收到iceconnectionstatechange事件時調(diào)用的事件處理器 。 當(dāng)iceConnectionState改變時吠式,這個事件被觸發(fā)陡厘。
RTCPeerConnection.onidentityresult
是收到?identityresult事件時調(diào)用的事件處理器。?當(dāng)通過getIdentityAssertion()生成身份斷言, 或在生成一個answer或一個offer的過程中特占,這個事件被觸發(fā)糙置。
RTCPeerConnection.onidpassertionerror
是收到?idpassertionerror?事件時調(diào)用的事件處理器。當(dāng)生成一個身份斷言時摩钙,如果關(guān)聯(lián)的身份提供者(idP)遇到一個錯誤罢低,這個事件就會被觸發(fā)查辩。
RTCPeerConnection.onidpvalidationerror
是收到?idpvalidationerror?事件時調(diào)用的事件處理器胖笛。當(dāng)檢查 一個身份斷言時,如果關(guān)聯(lián)的身份提供者(idP)遇到一個錯誤宜岛,這個事件就會被觸發(fā)长踊。
RTCPeerConnection.onnegotiationneeded
是收到negotiationneeded?事件時調(diào)用的事件處理器,?瀏覽器發(fā)送該事件以告知在將來某一時刻需要協(xié)商萍倡。
RTCPeerConnection.onpeeridentity
是收到peeridentity?事件時調(diào)用的事件處理器, 當(dāng)一條連接的peer identify被設(shè)置以及校驗后身弊,該事件被觸發(fā)
RTCPeerConnection.onremovestream
是收到removestream?事件時調(diào)用的事件處理器,當(dāng)一條MediaStream?從連接上移除時,該事件被觸發(fā)阱佛。
RTCPeerConnection.onsignalingstatechange
是收到signalingstatechange?事件時調(diào)用的事件處理器, 當(dāng)signalingState的值發(fā)生改變時帖汞,該事件被觸發(fā)。
方法
RTCPeerConnection的初始化函數(shù)凑术,通過 new RTCPeerConnection()初始化一個RTCPeerConnection實例翩蘸。
RTCPeerConnection.createOffer()
生成一個offer,它是一個帶有特定的配置信息尋找遠端匹配機器(peer)的請求淮逊。這個方法的前兩個參數(shù)分別是方法調(diào)用成功以及失敗的回調(diào)函數(shù)催首,可選的第三個參數(shù)是用戶對視頻流以及音頻流的定制選項(一個對象)。
RTCPeerConnection.createAnswer()
在協(xié)調(diào)一條連接中的兩端offer/answers時泄鹏,根據(jù)從遠端發(fā)來的offer生成一個answer郎任。這個方法的前兩個參數(shù)分別是方法調(diào)用成功以及失敗時的回調(diào)函數(shù),可選的第三個參數(shù)是生成的answer的可供選項备籽。
RTCPeerConnection.setLocalDescription()
改變與連接相關(guān)的本地描述舶治。這個描述定義了連接的屬性,例如:連接的編碼方式胶台。連接會受到它的改變的影響歼疮,而且連接必須能同時支持新的以及舊的描述。這個方法可以接收三個參數(shù)诈唬,一個RTCSessionDescription?對象包含設(shè)置信息韩脏,還有兩個回調(diào)函數(shù),它們分別是方法調(diào)用成功以及失敗的回調(diào)函數(shù)铸磅。
RTCPeerConnection.setRemoteDescription()
改變與連接相關(guān)的遠端描述赡矢。這個描述定義了連接的屬性,例如:連接的編碼方式阅仔。連接會受到它的改變的影響吹散,而且連接必須能同時支持新的以及舊的描述。這個方法可以接收三個參數(shù)八酒,一個RTCSessionDescription?對象包含設(shè)置信息空民,還有兩個回調(diào)函數(shù),它們分別是方法調(diào)用成功以及失敗的回調(diào)函數(shù)羞迷。
更新ICE服務(wù)器時調(diào)用的方法界轩。
RTCPeerConnection.addIceCandidate()
添加iceCandidate時調(diào)用的方法。
RTCPeerConnection.getConfiguration()
獲取配置信息時調(diào)用的方法衔瓮。
RTCPeerConnection.getLocalStreams()
返回連接的本地媒體流數(shù)組浊猾。這個數(shù)組可能是空數(shù)組。
RTCPeerConnection.getRemoteStreams()
返回連接的遠端媒體流數(shù)組热鞍。這個數(shù)組可能是空數(shù)組葫慎。
RTCPeerConnection.getStreamById()
返回連接中與所給id匹配的媒體流?MediaStream衔彻,如果沒有匹配項,返回null偷办。
添加一個媒體流?MediaStream作為本地音頻或視頻源艰额。如果本地端與遠端協(xié)調(diào)已經(jīng)發(fā)生了,那么需要一個新的媒體流椒涯,這樣遠端才可以使用它悴晰。
RTCPeerConnection.removeStream()
將一個作為本地音頻或視頻源的媒體流?MediaStream移除。如果本地端與遠端協(xié)調(diào)已經(jīng)發(fā)生了逐工,那么需要一個新的媒體流铡溪,這樣遠端才可以停止使用它。
關(guān)閉一個RTCPeerConnection實例所調(diào)用的方法泪喊。
RTCPeerConnection.createDataChannel()
在一條連接上建立一個新的RTCDataChannel(用于數(shù)據(jù)發(fā)送)棕硫。這個方法把一個數(shù)據(jù)對象作為參數(shù),數(shù)據(jù)對象中包含必要的配置信息袒啼。
RTCPeerConnection.createDTMFSender()
創(chuàng)建一個新的與特殊的MediaStreamTrack相關(guān)的RTCDTMFSender哈扮,可以在連接上發(fā)送DTMF手機信號。
生成一個新的RTCStatsReport蚓再,它包含連接相關(guān)的統(tǒng)計信息滑肉。
RTCPeerConnection.setIdentityProvider()
根據(jù)所給的三個參數(shù)設(shè)置身份提供者(IdP),這三個參數(shù)是它的名稱摘仅,通信所使用的協(xié)議(可選)靶庙,以及一個可選的用戶名。只有當(dāng)一個斷言被需要時娃属,這個IdP才會被使用六荒。
RTCPeerConnection.getIdentityAssertion()
初始化身份斷言的收集,只有當(dāng)signalingState的值不為"closed"時矾端,它才有效掏击。它自動完成,在需求發(fā)生前調(diào)用它是最好的選擇秩铆。
構(gòu)造函數(shù)
new RTCPeerConnection(RTCConfigurationconfiguration, optionalMediaConstraintsconstraints);
注意:PeerConnection需要傳遞一個RTCConfiguration對象作為參數(shù)砚亭,如果你沒有傳遞參數(shù)的話,火狐瀏覽器會自動提供一個參數(shù)殴玛。
方法
createOffer
void createOffer(RTCSessionDescriptionCallback?successCallback,RTCPeerConnectionErrorCallback?failureCallback, optional?MediaConstraintsconstraints);
createOffer方法會生成描述信息的一個blob對象捅膘,它會幫助連接到本地機器。當(dāng)你已經(jīng)找到一個遠端的PeerConnection并且打算設(shè)置建立本地的PeerConnection時族阅,你可以使用該方法篓跛。
舉例
var pc = new PeerConnection();pc.addStream(video);pc.createOffer(function(desc){? pc.setLocalDescription(desc, function() {? ? // send the offer to a server that can negotiate with a remote client? });}
參數(shù)
successCallback(方法調(diào)用成功時的回調(diào)函數(shù))
一個?RTCSessionDescriptionCallback?它會收到一個RTCSessionDescription?對象作為參數(shù)膝捞。
errorCallback(方法調(diào)用失敗時的回調(diào)函數(shù))
一個?RTCPeerConnectionErrorCallback?它會收到一個DOMError?對象作為參數(shù)坦刀。
[optional] constraints(可選的約束條件)
一個可選的MediaConstraints?對象愧沟。
createAnswer
void createAnswer(RTCSessionDescriptionCallback?successCallback,RTCPeerConnectionErrorCallback?failureCallback, optional?MediaConstraintsconstraints)")
對從遠方收到的offer進行回答。
舉例
var pc = new PeerConnection();pc.setRemoteDescription(new RTCSessionDescription(offer), function() {? pc.createAnswer(function(answer) {? ? pc.setLocalDescription(answer, function() {? ? ? // send the answer to the remote connection? ? })? })});
參數(shù)
successCallback(方法調(diào)用成功時的回調(diào)函數(shù))
一個?RTCSessionDescriptionCallback?它會收到一個RTCSessionDescription?對象作為參數(shù)鲤遥。
errorCallback(方法調(diào)用失敗時的回調(diào)函數(shù))
一個?RTCPeerConnectionErrorCallback?它會收到一個DOMError?對象作為參數(shù)沐寺。
[optional] constraints(可選的約束條件)
一個可選的MediaConstraints?對象。
updateIce()
updateIce(optional?RTCConfiguration?configuration, optional?MediaConstraintsconstraints)
該方法會更新ICE代理收集本地candidates以及連接云端candidates的進程盖奈。如果強制約束條件"IceTransports"存在混坞,那么它會控制ICE代理的工作方式。它可以用于限制接聽者對TURN candidates的使用钢坦,這樣可以避免在請求被應(yīng)答前泄露位置信息究孕。如果這個方法影響了已經(jīng)建立的連接,那么它可能導(dǎo)致ICE代理狀態(tài)的改變以及媒體狀態(tài)的改變爹凹。
舉例
addIceCandidate()
addIceCandidate (RTCIceCandidate?candidate,?Function?successCallback,?RTCPeerConnectionErrorCallback?failureCallback);
除了被添加到遠端描述之外厨诸,只要約束條件"IceTransports" 沒有被設(shè)置為null,連接檢測結(jié)果會被發(fā)送給新的candidates禾酱。如果這個方法影響了已經(jīng)建立的連接微酬,那么它可能導(dǎo)致ICE代理狀態(tài)的改變以及媒體狀態(tài)的改變。
舉例
pc.addIceCandidate(new RTCIceCandidate(candidate));
createDataChannel
RTCDataChannel?createDataChannel (DOMString?label, optionalRTCDataChannelInit?dataChannelDict);
通過peerconnection建立一條數(shù)據(jù)信道颤陶,用于發(fā)送非視頻音頻信息颗管。
例子
var pc = new PeerConnection();var channel = pc.createDataChannel("Mydata");channel.onopen = function(event) {channel.send('sending a message');}channel.onmessage = function(event) { console.log(event.data); }
引申閱讀
https://github.com/jesup/nightly-gupshup/blob/master/static/js/chat.js
http://www.html5rocks.com/en/tutorials/webrtc/basics/#toc-simple
http://dev.w3.org/2011/webrtc/editor/webrtc.html
文檔標(biāo)簽和貢獻者
?標(biāo)簽:?
此頁面的貢獻者:?ztacesa,?yxxgoogle,?Move,?zhuyeqing5828,?Wunmest
最后編輯者:?ztacesa,?Aug 24, 2017, 8:34:52 AM