文档章节

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

Courage
 Courage
发布于 2015/09/07 15:20
字数 973
阅读 5628
收藏 255

    示例可在: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)。参考上一篇内容。


© 著作权归作者所有

Courage
粉丝 18
博文 5
码字总数 8696
作品 1
西城
私信 提问
加载中

评论(29)

f
freetan
请发下 php的示例 参考,谢谢!
tanetbls@126.com
SuperCaputain
SuperCaputain

引用来自“然乌”的评论

引用来自“然乌”的评论

至少给个安装使用教程之类的嘛

引用来自“Courage”的评论

直接启动就好,或者看 github 里的指南
在linux下面各种缺东西 在window下面直接内存错误 可以加qq聊么

ewfewfewfe
Courage
Courage 博主

引用来自“然乌”的评论

至少给个安装使用教程之类的嘛

引用来自“Courage”的评论

直接启动就好,或者看 github 里的指南

引用来自“然乌”的评论

在linux下面各种缺东西 在window下面直接内存错误 可以加qq聊么
linux 下都是基础的库,应该是版本不符合。windows 下内存错误?是缺少 dll 吧?
御污渔
御污渔

引用来自“然乌”的评论

至少给个安装使用教程之类的嘛

引用来自“Courage”的评论

直接启动就好,或者看 github 里的指南
在linux下面各种缺东西 在window下面直接内存错误 可以加qq聊么
Courage
Courage 博主

引用来自“然乌”的评论

至少给个安装使用教程之类的嘛
直接启动就好,或者看 github 里的指南
御污渔
御污渔
至少给个安装使用教程之类的嘛
hantsy
hantsy

引用来自“purple_grape”的评论

LFS名字已经被人占了,换个名字吧
Linux From Scratch 好流行的发行版本,Hacker的最爱
Courage
Courage 博主

引用来自“mxbyshell”的评论

不开源,无明确发展、演进计划,详细架构,不敢使用。
架构、计划在这:http://my.oschina.net/courage/blog/474323
mxbyshell
mxbyshell
不开源,无明确发展、演进计划,详细架构,不敢使用。
Courage
Courage 博主

引用来自“zhaoyou”的评论

流媒体服务的瓶颈是在文件系统吗?22
不是说瓶颈在文件系统,这只是用来做一个流媒体服务而已,与其说比其他系统更快,其实我更喜欢的是单个文件 ID 可以存储不断增长的数据(增量)
OSChina 开源周刊 51 期,Java 领衔 TIOBE 九月排行榜

本周开源资讯 TIOBE 9 月编程语言排行榜,新 TIOBE 指数算法 Microsoft Edge 将支持开源视频编解码器 VP9 Firefox for iOS 首个公共预览版发布,只限新西兰 被入侵后,Mozilla 要提高 Bugzil...

OSC编辑部
2015/09/11
6.4K
1
anyRTC/anyRTMPC-HybridEngine-Android

RTMPCHybridEngine-Android 基于RTMP和RTC混合引擎的在线视频连麦互动直播 Android 直播(网络自适应码率RTMP publisher)、点播播放器(播放器经过专业优化,可实现秒开RTMP Player)、基于...

anyRTC
2016/10/08
0
0
anyRTC/AnyRTC-RTMP

AnyRTC-RTMP 本次开源的客户端基于RTMP协议的推流拉流客户端,由我司CTO亲自操刀设计,采用跨平台架构一套代码支持Android、iOS、Windows等平台。 直播涉及的流程:『音视频采集->编码->传输...

anyRTC
2016/09/20
0
0
AnyRTC全新开源项目助力直播

本次开源的客户端基于RTMP协议的推流拉流客户端,由我司CTO亲自操刀设计,采用跨平台架构一套代码支持Android、iOS、Windows等平台。 直播涉及的流程:『音视频采集->编码->传输->解码->音视...

Eric不爱
2016/09/24
1K
8
“聚势,重生” —— 武汉精英企业技术分享专场

为什么要来北京?因为这里没有家。 每个人心里都有英雄和浪漫的情怀,无论下农田还是进国企,做老师还是当公务员,留在家乡能做的事情一只手都能数得过来,更不用说家里还有攀比、诘问、无可...

简寻
2017/03/31
9
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
21分钟前
2
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
32分钟前
2
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
33分钟前
2
0
好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
39分钟前
6
0
IDEA 自定义方法注解模板

IDEA 自定义方法注解模板 1、使用效果 /*** 计算交易费用* @Author wangjiafang* @Date 2019/9/11* @param feeComputeVo* @return*/@PostMapping("/v1/fee_compute")public ApiResp......

小白的成长
39分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部