我知道传统方法是将图像/视频文件存储在一个地方,然后将引用索引保存到db的表中。
现在我正在学习gundb,我可以很容易地存储键值json类型的数据,但是由于它是去中心化的,所以如果我想创建一个聊天室应用程序,应该如何处理图像存储(例如:用户的头像)?
我还想知道是否可以使用gundb制作电影共享应用程序?
答案 0 :(得分:4)
@Retric,很好的问题!我不确定为什么人们会不喜欢你,他们一定是讨厌者。
是的,最好存储该图像/视频并通过GUN进行引用。对于视频而言,WebTorrent / BitTorrent现在已经进行了P2P视频共享,已经有十多年的历史了,它一度处理了全球40%的互联网流量!
但是,WebTorrent / BitTorrent在发现/共享这些URI(磁铁链接等)方面不是很好,但是GUN却可以。因此,我建议将其作为一种选择。
对于图片,尤其是小图片(例如头像/图标/个人资料),我经常通过Base64
对其进行编码来直接将它们存储在GUN中(世界上许多网站都将图片/图标/精灵/头像插入到CSS文件中, base64数据URL,但现在您可以为此使用GUN。
如果您对此感兴趣,我使用jQuery编写了一个小实用程序,可让您将图像拖放到您的网站中,它将自动调整大小(通过选项将其覆盖)并对其进行base64编码,然后保存到枪:
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视频文件存储在BitTorrent或集中式服务器上,而不是将其存储在GUN中,这样HLS.js可以很容易地与GUN集成。
现在您将拥有P2P去中心化视频流!!!
更酷的是,您可以将其与GUN的lib/webrtc
适配器结合使用,并在浏览器之间进行完全浏览!
我希望这会有所帮助。