我希望能够通过dat实时流式传输视频(或其他大文件,并不断对其进行修改/添加)。

Here它说,


  dat://协议不支持文件级的部分更新,
  这意味着在单个文件中有多个记录,每次
  用户添加一条记录,跟随该用户的任何人都必须同步并
  重新下载整个文件。随着文件的不断增长,
  性能将下降。将每条记录放在一个单独的文件中是
  效率更高:创建记录时,网络中的对等方
  将仅下载新创建的文件。


但是,它还说heredat使用Rabin指纹识别来创建确定性的文件块,因此,大概dat客户端将能够通过其哈希轻松识别其已下载的块,因此应该能够如果这是唯一已更改的部分,则仅下载文件的最后最后一块。

还有here in the faq,它说:


  Dat使用的Merkle树的类型可让同伴比较哪些
  他们每个人都有的特定版本的数据集
  交换增量以完成完全同步。


hypervision,但是从我对它的工作原理的基本了解来看,它似乎为视频数据保存了自己的“ bundle.js”文件,我不确定它是如何实现流式传输的,但这并不完全是与我要实现的目标相同,即能够有效地传输任意大的且正在扩展的文件,例如.ts或.mkv视频流。

因此,我的问题是-是视频的有效实时流传输(即,无需重新下载已下载的块)是目前尚不支持并可以在将来添加的某些内容,或者是使用dat协议本质上无法实现的内容?

最佳答案

简而言之,Dat构建在其之上的低级超核协议应该可以很好地用于视频和其他“软实时”流媒体使用。但是,Dat(应用程序)所建立的超级驱动器文件/目录抽象目前不适用于这些用例。没有什么可以阻止超级驱动器与单个“任意大且正在扩展的文件”一起正常工作,但是尚未针对该特定用例对其进行优化。



据我所知,当前所有的视频流原型都通过将视频内容直接编码为超核而不是超级驱动器“文件和目录”抽象来工作。这有点像将原始字节写入硬盘而不是使用文件系统之间的区别。 P2P视频和音频流是超核的明确设计目标。请注意,可能有也可能没有到现有文件格式或流协议的直接映射。超核抽象表示为字节块的流,每个字节块的上限大约为一兆字节。

作为一个小细节,dat / hypercore协议和磁盘格式未指定任何特定的“分块”机制。 Rabin分块已进行了试验,但是默认情况下,几乎所有客户端都使用固定大小的分块来简化和提高速度(这并不意味着将来不可能实现对性能敏感的分块)。从理论上讲,客户端在任何情况下都将能够检测到重复的块并避免重新下载(以及磁盘上的重复存储),但是从2018年夏季开始尚未实现此优化。

Hyperdrive当前要求将所有文件作为连续的块存储在“内容”超核源中。这非常有效,但是使重复数据删除变得困难。作为一种特殊情况,应该有可能支持追加到最新文件(直接追加到内容提要)而无需复制整个文件。每当提要中的任何其他文件被更新或创建时,都会破坏连续的块,但是对于您的用例来说,它可能已经足够好(如果要实施此优化)。

07-26 09:34