2017-01-23 41 views
2

this document中,它使用URL.createObjectURL來設置視頻源。 (這是接聽電話的代碼)。爲什麼通過URL.createObjectURL生成WebRTC遠程視頻源

var offer = getOfferFromFriend(); 
navigator.getUserMedia({video: true}, function(stream) { 
    pc.onaddstream = e => video.src = URL.createObjectURL(e.stream); 
    pc.addStream(stream); 

    pc.setRemoteDescription(new RTCSessionDescription(offer), function() { 
    pc.createAnswer(function(answer) { 
     pc.setLocalDescription(answer, function() { 
     // send the answer to a server to be forwarded back to the caller (you) 
     }, error); 
    }, error); 
    }, error); 
}); 

我期望video.src是檢索遠程視頻的地址。所以它應該是固定的,並由連接的另一方(發起呼叫的人)給出。但是URL.createObjectURL的值是在回答者側生成的,並且它的事件取決於函數何時被調用。它如何被用來獲取遠程視頻流?

編輯: URL.createObjectURL的結果看起來像blob:http://some.site.com/xxxx-the-token-xxxx。有了這個字符串,視頻組件如何知道在哪裏加載遠程流?是否有存儲在某處的{url:stream}的散列圖?如果是這樣,視頻組件如何訪問hashmap?

流對象不會存儲令牌字符串,您可以通過stream.toURL獲取該令牌字符串。但它與URL.createObjectURL的結果不同。 URL.createObjectURL的值取決於時間。如果你連續調用它兩次,你會得到不同的值。

回答

6

URL.createObjectURL(stream)是一個黑客。停止使用它。正在努力對remove it。可直接使用video.srcObject = stream。這是標準和良好實施。

本地資源的分配不應該是第一個URL,並且是理解WebRTC工作原理的紅色鯡魚。

WebRTC是一種傳輸API,可以直接從一個對端向另一個對端發送數據。沒有涉及內容網址。您從onaddstream獲得的遠程stream是本地對象接收器端,並且是傳輸的實時流式傳輸結果,準備播放。

您閱讀的文檔陳舊且過時。感謝您指出,我會解決它。它還有其他問題:你應該立即致電setRemoteDescription ,不要等待接收器分享他們的相機,否則錯過了新來的候選人。相反,你展示的代碼,這樣做:

pc.onaddstream = e => video.srcObject = e.stream; 

function getOfferFromFriend(offer) { 
    return pc.setRemoteDescription(new RTCSessionDescription(offer)) 
    .then(() => navigator.getUserMedia({video: true})) 
    .then(stream => { 
     pc.addStream(stream); 
     return pc.createAnswer(); 
    }) 
    .then(answer => pc.setLocalDescription(answer)) 
    .then(() => { 
     // send the answer to a server to be forwarded back to the caller (you) 
    }) 
    .catch(error); 
} 

它採用srcObject,避免過時的回調API,並不會導致間歇性故障ICE。

+0

謝謝你jib!這幫助我縮小了導致我的問題的原因。但我仍然無法弄清楚我原來的問題。你可以看看我的問題[這裏](http://stackoverflow.com/q/41917545/3838949)?我的iceConnectionState從「檢查」跳轉到「關閉」。我不確定是什麼導致了這個問題。 –

1

由於WebRTC連接涉及多個步驟,因此您從此類連接中獲得的是流。但video標記的src屬性不接受流,而是接受URL。這是將一個流「轉換」爲一個URL的方式。

+0

我知道你需要一個URL,但我不明白爲什麼這個URL是以這種方式生成的。我處於需要自己編寫'URL.createObjectURL'的情況,因爲它在React Native中不可用。所以我嘗試使用'stream.toURL',它產生一個不同於'URL.createObjectURL'產生的標記。看來視頻組件無法使用此令牌正確獲取遠程視頻。 'stream.toURL'的值實際上對我更有意義,因爲它不依賴於時間。 –

+0

'URL.createObjectURL'的結果看起來像'blob:http:// some.site.com/xxxx-the-token-xxxx'。用這個字符串,視頻組件如何知道在哪裏加載遠程流?有沒有存儲在某處的'{url:stream}'的散列表?如果是這樣,視頻組件如何訪問hashmap? –

+0

這個映射是瀏覽器內部的。我認爲你不能以任何方式訪問/控制它。 –

相關問題