用 LFS 做极简高效的流媒体服务

示例可在:github git@osc 找到,包含一个详细的图片服务器

图片服务演示(简单部署了 php 的服务):

浏览图片:http://lfs2-ikcourage.myalauda.cn/testimage/image.php?type=read&id=1

上传图片:http://lfs2-ikcourage.myalauda.cn/testimage/upload.php (图片会自动周期性删除)

先做一个音乐、视频、图片等媒体文件的上传和下载示例。都只需要一行。

FileInputStream inputStream = new FileInputStream(file);
fileId = LFS_Stream.writeStream(FILE_NAME, fileId, inputStream, file.length());

OK,一个媒体文件上传成功后会返回一个文件 ID。

即使是一个比较大的视频,比如大于 10G,也依然只有这一行代码,并不需要做切片存储,并且无需担心内存使用。(大文件的上传也变的如此简单)

下载:

//读到 readStream 中
LFS_Stream.readStream(FILE_NAME, fileId, readStream);

没错,就是这一行啦,根据文件 ID 读取文件,把数据通知给 readStream。

那么,我们来看看 readStream 做了什么。(这就是一个完整的媒体服务的示例)

IReadStream readStream = new IReadStream() {
    public boolean init(long fileId, int size, long sizeTotal, long sizeTotalRead, long offset) {
        response.setIntHeader("Content-Length", (int)sizeTotalRead);
        response.setHeader("Cache-Control", "max-age=604800");
        response.setIntHeader("Etag", 0);
        return true;
    }

    //参数好多啊,不要被吓到了,只有前两个是你需要用的
    //其他的只是为了避免全局变量而已(如果需要的话,所幸,绝大多数场景都不会需要)
    public boolean parseData(byte[] b, int bytesAvalibale, int size, long sizeTotal, long sizeTotalRead, long sizeTotalReaded, long offset) {
        try {
            //这里应实现自己的数据输出,比如输出到 http
            response.getOutputStream().write(b, 0, bytesAvalibale);
            return true;
        } catch (Exception e) {}
        return false;
    }
};

init 只会在 parseData 前调用一次,用来获取文件的真实大小,比如我们可能需要为 http 添加 Content-Length 的头等。

parseData 每次都会调用,把缓冲中的数据输出到 http 的输出流中,bytesAvalibale 是缓冲中的有效字节大小。

到这里你会发现,parseData 中是流式输出数据的,所以这保证了音乐、视频等流媒体的流畅度,并且也有效降低了服务器的内存占用。因为缓冲的大小是非常小的,你可以理解为 Socket 的缓冲大小,并且可调节,默认大小 2K(注:不是带宽的大小,这是一个远高于带宽的值)。

这意味着一台服务器,即使提供视频服务也游刃有余。1W 人同时观看视频只需要不到 20M 的内存(资源过剩的浪费)。

既然是流媒体服务(图片也是,在浏览器中快速刷新,会看到图片一点点的渲染),那么断点下载很重要,断点上传也很重要。

断点下载:

//多了两个参数
LFS_Stream.readStream(String fileName,
    long fileId,
    IReadStream readStream,
    long offset,
    long sizeTotalRead);

还是那一行,只不过多了一个偏移和读取大小而已,很简单不是么。

断点上传:

//多了两个参数
LFS_Stream.writeStream(String fileName,
    long fileId,
    InputStream inputStream,
    long sizeTotalWrite,
    long offset,
    long sizeTotal);
sizeTotalWrite 是要写的大小,sizeTotal 是文件的总大小。

这句话的含义是:把文件的总大小设置为 sizeTotal,并且在 offset 处写入 sizeTotalWrite 大小的内容。

上传下载就是如此的简单。

    LFS 的启动

    首先从 github 获取一个 LFS

    然后以守护模式运行 LFS --dir [存储目录] --daemon

    这就好了

最后,如果需要自定义文件名的话,可以使用 LFS 的索引(即:key, value)。参考上一篇内容。

文章转载自 开源中国社区[https://www.oschina.net]

时间: 2024-10-01 11:56:25

用 LFS 做极简高效的流媒体服务的相关文章

大数据的设计师帮你快速搞定一个极简风格网站

  如何快速做出一个极简风格网站?国外某个网站统计分析了112个明显带有极简风格的网站后,发布了这篇超级干货.全程都是以数据来说话,从占比最大的设计要素开始说起,有案例有分析,把极简风格的设计彻底发挥到了术的地步. 最小化设计的目标是移除界面当中不必要的元素或内容,减少干扰,使界面最大程度的支持用户的任务流程. 要将界面以恰当的方式简化到只保留必要元素的程度,设计师需要对一系列与最小化策略高度相关的设计模式有所了解.界面设计,就像人类的语言一样,最终是由人们的使用方式所定义的.如今,虽然"最小化

《Kotin 极简教程》第14章 使用 Kotlin DSL

第14章 使用 Kotlin DSL 最新上架!!!< Kotlin极简教程> 陈光剑 (机械工业出版社) 可直接打开京东,淘宝,当当===> 搜索: Kotlin 极简教程http://www.jianshu.com/p/35b487734339 我们在前面的章节中,已经看到了 Kotlin DSL 的强大功能.例如Gradle 的配置文件 build.gradle (Groovy),以及前面我们涉及到的Gradle Script Kotlin(Kotlin).Anko(Kotlin)

张小龙七项产品理念背后的极简主义

导读:在张小龙向微信事业群发出公开信里,他提出了七项理念,在这些理念中,其实体现出了他在产品与管理方面奉行的哲学思想,那就是极简主义.本文打算与读者分享张小龙的产品哲学. 在5月6日,腾讯公司方面宣布了将对组织架构进行调整,从而成立微信事业群,并且毫无悬念的由张小龙担任微信事业群总裁. 在张小龙向微信事业群发出公开信中,他提出了七项理念:一是要做对用户有价值的事情.二是要保持自身的价值观,因为它将会体现在我们的产品和服务中.三是要保持小团队,保持敏捷.四是要学习和快速迭代比过去的经验更重要.五就

极简网络:不止于4.0,只为“更简单”

这是一个严重依赖网络的时代,它像空气.水.电一样不可或缺.同时,网络的复杂性也在逐步增加,从纯二层的存储转发到三层交换,再到分布式.虚拟化.多业务.开放式.多变的架构.海量的接入.多样的认证.复杂的管理.多维的计费,正在消耗掉本应该留在业务上的注意力. 网络必须改变,回到简单易用,回到高效便捷.让业务体验更加流畅,让管理策略更加简化,这是来自用户最真切的声音,也是最核心的诉求. 锐捷网络听到了用户的声音.2013年,锐捷提出了打破传统庞杂体系的基础网络新主张--用户只需要"一台"交换机

提升用户体验 从极简网络开始

众所周知,如何"提升用户体验"是互联网时代的精神,尤其是在移动互联网时代全面来临之际,很多企业传统的经营理念及运作模式受到新环境的冲击,因此对传统业务模式的创新与改革已经迫在眉睫. 而要真正做到对用户体验的提升并不像我们想象的那样容易,如果没有一套科学系统的方法,实施起来很难保障最终的效果.近期,锐捷网络行业解决方案经理孙菁玮在做客ZDNet网络公开课栏目时,针对在无线网络环境下如何才能做到提升用户的体验进行表述,并提出了移动互联下的极简网络架构. 而何为移动互联下的极简网络架构呢?孙

百度新版首页上线,走极简路线

重剑无锋百度新首页极致至简 7月31日,甲午年,辛未月,癸卯日,宜起基.上柱.上梁.安门.这一天,百度新版首页上线,走极简路线. 从2002年增加MP3搜索,到2003年上线新闻.图片搜索与贴吧,百度的首页搜索框,一直在不断完善,做着加法.伴随搜索功能完善的,是百度创业期的超高速增长.此前,百度首页定稿于2007年,7年来,百度公司业务上快速扩张,但百度首页却是波澜不惊. 佛家说,人生有三重境界:看山是山,看水是水;看山不是山,看水不是水;看山还是山,看水还是水.这一次,百度新版首页的极简路线,

“呵擦么”,之所赌“呵一下”的极简社交

摘要: 任何一种暂时还看不太透的新社交方式,我都希望能更多的时间能极尽其可能性,比如在微信.Facebook等产品信息噪音越来越大的语境下,极简社交的思路能带给人们什么?除了Yo,我们 任何一种暂时还看不太透的新社交方式,我都希望能更多的时间能极尽其可能性,比如在微信.Facebook等产品信息噪音越来越大的语境下,极简社交的思路能带给人们什么?除了Yo,我们之前报道过的一款产品"呵擦么"也在朝着这个方向思考. "呵擦么"刚刚发布了2.0版本,相较之前这一版更强化了

微博的设计体验:运用极简设计风格网页设计案例

文章描述:微博的设计体验也是如此,我们去掉了复杂的视觉干扰,力求给用户带来愉悦轻松的视觉体验. Hi 大家好,我是阿木,今天我结合我在微博的实际项目跟大家分享一下极简风格的一点设计心得.现代城市生活中我们每天要面对嘈杂拥堵的街道和地铁,各式各样的广告,处理各种邮件和信息.于是我们内心追求一种体验那就是-极简,像大家家喻户晓的品牌如:MUJI无印良品. 苹果 .宜家家居,都是这一风格的发扬者,他们的产品也获得了巨大成功. 极简在摄影中是一种突出主体取简去繁的摄影手法,在生活中是一种放松的生活态度,

研究极简主义设计:简化您的设计

文章描述:[译]简约主义设计:少就是多. 本文翻译自老外的一篇文章(原文),但并不是完全的直译,文章中加入了我的一些经验与想法: 作为设计师的我们,都知道一个简约的设计可以创造出很美观的结果.然而,在真正去做的时候许多设计师都会遇到麻烦,在用相当少的元素去设计一个页面时,感觉相当的困难,结果都会觉得这个页面看上去像没完成的.网上有许多关于极简主义设计的文章可以去帮助你去实现效果,但却不是仅有的办法.现在,我会举一些关于极简主义设计的例子,大家可以去分析为什么有些能起作用有些却不能. 什么是简约的