[英]FFmpeg to WebRTC via UDP and DataChannel for low latency screenshare
[英]Creating meta-data for binary chunks for sending via WebRTC datachannel
我在兩個瀏覽器之間建立了數據通道連接,並希望將文件拆分為多個塊,然后將其發送到客戶端或從客戶端發送出去。
我可以讀取文件並將其分解為幾塊。 但是我需要一種讓接收客戶知道的方法
數據塊與哪個文件有關(唯一標識符)。
該塊適用於重建的哪個位置(索引號)。
在瀏覽器中傳輸二進制數據時,似乎整個有效負載必須是二進制的。 因此,例如,我無法創建具有上述屬性的JSON對象,而無法擁有具有實際二進制塊的data
屬性。
我想我需要將文件塊包裝到包含標識符和索引的輔助二進制blob中。 然后,接收方客戶端將解碼第一個包裝塊,以檢查元數據,然后根據該信息處理實際文件塊。
如何在瀏覽器中執行此操作? 我已經做了很多Google搜索,但是似乎找不到任何信息,所以想知道我是否正在忽略一些可以簡化此過程的信息嗎?
您必須創建自己的協議來傳輸文件。
File
/ Blob
對象。 您可能還使用split()
方法獲取塊。 您可以簡單地使用Uint8Array傳輸數據。
創建一個滿足您需求的協議,例如:
發送初始包(例如,類型0x01)
發送數據塊(例如,類型0x02)
注意 :如果要傳輸多個文件,則應添加一個ID或其他名稱。
在接收方,您可以等待初始包並創建一個具有總文件長度的新Uint8Array
。 之后,您可以使用set()
在塊位置添加接收到的數據(偏移量= 0-based-chunk-number
* chunk-size
)。 收到所有塊后,您可以創建Blob
。
除了@Robert的非常好的答案之外,您還可以使用channel.send(blob)(至少在Firefox <-> Firefox中)。 最終,這也應該在Chrome中也可以使用。
如果僅涉及多個文件,則可以為每個新文件創建一個新的數據通道。
每個通道都會照顧自己的緩沖,順序等。
就像是:
chan = peerCon.createDataChannel("/somedir/somefile", props);
然后將文件分成<64k個塊,並chan.send()
它們進行chan.send()
。
接收方可以獲取標簽並使用它適當地保存文件
peerCon.ondatachannel = function(channel) {
console.log("New file " + channel.label);
channel.onmessage = function(
等等
PS:如果您確實必須在單個通道上使用文件系統協議(例如,因為您想要隨機訪問行為),請不要發明新的協議,請使用已經存在並經過測試的協議-我喜歡inferno / plan9的9p
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.