9

我知道传统的方法是将图像/视频文件存储在一个地方,然后将参考索引保存到 db 的表中。

现在我在学习gundb,我可以很容易地存储key-value json类型的数据,但是由于它是分散的,如果我想做一个说聊天室的应用程序,我应该如何处理图像存储(例如:用户的头像)?

我也想知道是否可以使用 gundb 制作电影共享应用程序?

4

1 回答 1

17

@Retric,好问题!我不确定为什么人们对你投反对票,他们一定是仇恨者。

你是对的,最好存储该图像/视频并通过 GUN 引用它。特别是对于视频,WebTorrent/BitTorrent 已经做了十多年的 P2P 视频共享,曾经处理过全球 40% 的互联网流量!

然而,WebTorrent/BitTorrent 在发现/共享这些 URI(磁力链接等)方面不是很好,但 GUN 是。因此,我建议将其作为一种选择。

对于图像,尤其是像头像/图标/配置文件这样的小图像,我经常通过Base64编码将它们直接存储在 GUN 中(世界上许多网站将图像/图标/精灵/头像内联到具有 base64 数据 URL 的 CSS 文件中,除了现在你可以为此使用 GUN)。

如果您对此感兴趣,我使用 jQuery 编写了一个小实用程序,可让您将图像拖放到您的网站中,它会自动调整大小(传递选项以覆盖它)并为您进行 base64 编码,然后保存到 GUN:

https://github.com/amark/gun/blob/master/lib/upload.js

这是我如何使用它的一个小例子:

$('#profile').upload(function resize(e, up){
    if(e.err){ return } // handle error
    $('#profile').addClass('pulse'); // css to indicate image processing
    if(up){ return up.shrink(e, resize, 64) } // pass it `e` drag&drop/upload event, then I reuse the current function (named resize) as the callback for it, and tell it resize to 64px.
    $('#profile').removeClass('pulse'); // css indicate done processing.
    $("#profile img").attr('src', e.base64).removeClass('none'); // set photo in HTML!
    gun.user().get('who').get('face').get('small').put(e.base64); // save profile thumbnail to GUN
});

最后,如果您不想使用 BitTorrent,如何将视频存储在 GUN 中?

我强烈建议使用 HLS 格式将视频存储在 GUN 中,这将允许您进行分散的实时视频流。这是一种非常简单的格式,甚至可以从静态文件中进行视频流式传输,因为它将视频存储在可以流式传输的小块中 - 非常适合 GUN。

已经有一个基于 JS 的 HLS 格式的视频播放器:

https://github.com/video-dev/hls.js/

根据演示页面,您可以看到视频存储方式的示例,例如在 GitHub 上:

https://github.com/video-dev/streams/tree/master/x36xhzz

(如果你点击 m3u8 文件,你会看到它有元数据,720p 存储在url_0文件夹中,文件夹本身有子文件)

gun.get('videos').get('x36xhzz').get('url_0').get('url_496').get('193039199_mp4_h264_aac_hd_7.ts').once(function(video_chunk){ passToHLSplayer(video_chunk) })您可以使用相同的文件夹结构将 HLS 视频文件存储在 GUN 中,以便 HLS.js 轻松与 GUN 集成,而不是将 HLS 视频文件存储在 BitTorrent 或集中式服务器上。

现在您将拥有 P2P 分散式视频流!!!

更酷的是,您可以将它与 GUN 的lib/webrtc适配器结合使用,完全浏览器到浏览器!

我希望这会有所帮助。

于 2018-12-16T02:53:47.170 回答