[英]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.