一款极简的流媒体Web服务器(Streaming Media Web Server),提供视频音乐的在线播放功能
一款极简的流媒体Web服务器(Streaming Media Web Server),提供视频音乐的在线播放功能
A extremely simple web server of streaming media, which can provide online play of video and audio
项目源码:https://github.com/HackyleShawe/StreamingMediaWebServer
项目背景
- 在硬盘上的高清电影,难道就只能在电脑上才能看吗?我想在手机上看行不行呢?
- 类似NAS(Network Attached Storage,网络附属存储)一样,搭建一个局域网私有视频云服务器
- 本项目的核心目的是做一个类似于视频NAS,可以在局域网下提供视频音乐、在线观看服务
市场上已有的局域网流媒体播放器平台
- flex:收费
- jellyfin:免费;坑多,可用性较差
- emby:收费;可用性还行
Features
- 以文件夹为单位,递归收集指定目录下的所有文件
- 虽然可收集所有类型的文件,但目前只可以在线观看视频、音乐,其他类型文件赞不支在线观看
- 视频文件的两种预览模式
- 列表模式:依次展示每个文件夹下的所有文件
- 宫格模式:以384px * 216px(是1920*1080的同比缩放)的格式展示视频、音乐文件
- 文件管理:文件删除、文件重命名
内容导览
Table of Contents
快速预览
列表模式
在列表模式下删除文件
列表模式下重命名文件
宫格模式
宫格模式下的实时播放
环境检查与配置
主要步骤
- 设置系统编码
- 安装Java以及配置环境变量
- 安装以及配置Tomcat
设置系统编码
前言:Windows环境无需配置此项
检查Linux系统编码环境:
为什么要检查系统编码:使得支持中文,可以正常显示中文的视频文件,以及解析URL中的中文
修改为UTF-8:
进入在root目录,在.bashrc和.profile文件中追加以下数据:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
使生效:
source .bashrc
source .profile
再检查:
Java环境
这里以aarch64的树莓派为例,演示安装过程。其他Linux和Windows平台同理。
查看系统平台:uname -a
根据平台下载JDK:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
上传解压:
- 在opt目录下创建Java文件夹,专门存放jdk数据:/opt/java
- 将jdk数据包上传并解压:tar -zxvf jdk-8u301-linux-aarch64.tar.gz
注意:usr存放的是系统自带的程序数据包,opt存放的是用户的数据包。
添加环境变量:
- 编辑:vim /etc/profile
- 追加以下数据:
export JAVA_HOME=/opt/jdk1.8.0_301
export PATH=$JAVA_HOME/bin/:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
- 使得配置的环境变量立即生效:source /etc/profile
- 查看是否配置成功:java -version
下载Tomcat
下载:https://tomcat.apache.org/download-90.cgi
上传解压:
- 在opt目录下创建Tomcat文件夹,专门存放jdk数据:/opt/tomcat
- 将jdk数据包上传并解压:tar -zxvf apache-tomcat-9.0.54.tar.gz
- 解压后将文件夹名字改短一点,方便以后使用:mv apache-tomcat-9.0.54 tomcat9
修改配置文件conf/server.xml,自定义端口和URI编码为UTF-8:
配置Tomcat
在Tomcat安装目录下的conf/server.xml中指定静态资源的目录,以及解析地址
凡是以/media开头的请求,全部都会解析到docBase指定的目录下
docBase指定的目录是视频文件的存放地点
部署
- 下载源码包:https://github.com/HackyleShawe/StreamingMediaWebServer
- 将其解压,重命名为一个简单的名字,我重命名为:ms,意为Media Server
- 复制ms到到%Tomcat%/webapps/
- 编辑WEB-INF/config.properties文件,指定为在配置Tomcat事conf/server.xml中指定静态资源的目录,也即docBase的值
- 启动Tomcat,指定%Tomcat%/bin/shartup.bat
- 访问项目:http://localhost:8080/ms/
首次访问
代码设计
设计思想
- 创建一个专门存放视频文件的目录,例如:D:\A03-Program\A-Programming\Media
- 配置Tomcat将所有的静态资源请求全部解析到该个文件夹下
- 写一个JSP来读取该目录下的所有媒体文件
- 点击媒体文件后,经过Tomcat就解析到了媒体文件的真实路径
index.jsp
功能
- 读取配置文件中指定路径下的所有视频文件,以文件夹为单位暂存
- 两种呈现方式:列表、宫格
读取配置文件主要逻辑
String projectPath = request.getSession().getServletContext().getRealPath(""); //获取项目的根目录
String path = projectPath + "/WEB-INF/config.properties";
//从配置文件中读取媒体文件的所在目录
FileInputStream is = new FileInputStream(path);
Properties pro = new Properties();
pro.load(is);
String mediaPath = pro.getProperty("media-path");
以文件夹为单位,收集该路径下的所有文件,暂存与Map
//递归收集路径(mediaPath)下的所有文件存于fileMap中
public void collectFile(String mediaPath, File file, Map<String, List<String>> fileMap) {
if(!file.exists()) {
return;
}
//收集文件
File[] files = file.listFiles(File::isFile);
if(files != null && files.length > 0) {
String name = file.getAbsolutePath().replace(File.separator, "/");
List<String> collect = Arrays.stream(files).map(ff -> ff.getName()).collect(Collectors.toList());
fileMap.put(name.replace(mediaPath, ""), collect);
}
//收集文件夹
File[] dirs = file.listFiles(File::isDirectory);
if(dirs == null || dirs.length < 1) {
return;
}
//递归收集文件夹下的子文件、文件夹
for (File dir : dirs) {
collectFile(mediaPath, dir, fileMap);
}
}
两种呈现模式,基于JSTL的choose-when标签,类似于Java的switch-case
<c:choose>
<c:when test="${!empty mode && mode == 'list' }"> <%-- else if 的意思 --%>
<p>No.${varSta.count}
<a href="delete.jsp?dir=${entry.key}&name=${name}"><b>删除</b></a>
<a href="rename.jsp?dir=${entry.key}&name=${name}"><b>重命名</b></a>
<a target="_blank" href="/media/${entry.key}/${name}">${name}</a>
</p>
</c:when>
<c:otherwise> <%-- else的意思 --%>
<!-- 视频的高度、宽度是按照1920*1080同比例缩小 -->
<video src="/media/${entry.key}/${name}" width="384px" height="216px" controls preload="auto"></video>
</c:otherwise>
</c:choose>
delete.jsp
删除文件:调用java.util.File的delete方法
<!-- 删除确认 -->
<c:if test="${!empty deleted && deleted == 'yes' }">
<%
String rootname = mediaRoot+"/"+dir+"/"+name;
// out.println(rootname);
File file = new File(rootname);
boolean del = file.delete();
// out.println(del);
response.sendRedirect("index.jsp?mode=list");
%>
</c:if>
rename.jsp
重命名文件:调用java.util.File的renameTo方法
<!-- 确认重命名 -->
<c:if test="${!empty renamed && renamed == 'yes' }">
<%
String oldDir = request.getParameter("oldDir");
String newDir = request.getParameter("newDir");
String oldName = request.getParameter("oldName");
String newName = request.getParameter("newName");
String oldname = mediaRoot + oldDir +"/"+ oldName;
String newname = mediaRoot + newDir +"/"+ newName;
if(!oldname.equals(newname)) {
File oldFile = new File(oldname);
File newFile = new File(newname);
if(oldFile.exists()) {
oldFile.renameTo(newFile);
response.sendRedirect("index.jsp?mode=list");
} else {
out.println("路径不存在: " + oldname);
out.println("<h1><a href='index.jsp?mode=list'>返回</a></h1>");
}
}
%>
</c:if>
一款极简的流媒体Web服务器(Streaming Media Web Server),提供视频音乐的在线播放功能的更多相关文章
- Resty 一款极简的restful轻量级的web框架
https://github.com/Dreampie/Resty Resty 一款极简的restful轻量级的web框架 开发文档 如果你还不是很了解restful,或者认为restful只是一种规 ...
- Tomcat Web服务器与常用Web服务器
一.常用Web服务器 Tomcat 由Apache组织提供的一种Web服务器,提供对jsp和servlet的支持.它是一种轻量级的javaWeb容器服务器.也是当前应用最广的JavaWeb服务器( ...
- Linux上部署web服务器并发布web项目-转
Linux上部署web服务器并发布web项目 近在学习如何在linux上搭建web服务器来发布web项目,由于本人是linux新手,所以中间入了不少坑,搞了好久才搞出点成果.以下是具体的详细步骤以 ...
- Linux上部署web服务器并发布web项目
近在学习如何在linux上搭建web服务器来发布web项目,由于本人是linux新手,所以中间入了不少坑,搞了好久才搞出点成果.以下是具体的详细步骤以及我对此做的一些总结和个人的一些见解,希望对跟我一 ...
- 【股票盯盘软件】01_程序员炒股之开发一款极简风格的股票盯盘软件StockDog_V1.0.0.1
1.前言 话说最近一段时间受疫情的影响,股市各种妖魔横行.本人作为一个入股市不满三年的小韭菜,就有幸见证了好几次历史,也是满心惊喜,就权当是接受资本市场的再教育了吧. 小韭菜的炒股方法其实很简单,这两 ...
- 极简】如何在服务器上安装SSL证书?
本文适合任何人了解,图形化操作.下面以腾讯云为例,并且服务器(linux)也安装了宝塔面板. 1.登陆腾讯云账号进入控制台,找到SSL的产品 2.按要求申请并填写表单,记住私钥密码 3.提交后,待腾讯 ...
- Node.js 极简入门Helloworld版服务器例子
粗浅得很,纯属备忘. // 内置http模块,提供了http服务器和客户端功能(path模块也是内置模块,而mime是附加模块) var http=require("http"); ...
- 极简SpringBoot指南-Chapter03-基于SpringBoot的Web服务
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- 5款极简极美WordPress主题,亲测可用附送源码
2020年深冬,新闻上报道是.从1950年以来最寒冷的冬天. 一个周六的下午,我找遍了全网的简约博客主题,搭建了三年来的第7个独立博客, 多么难得的周末啊,我却在家花了一整天的时间.整理出直接套用5️ ...
- php 极简框架ES发布(代码总和不到 400 行)
ES 框架简介 ES 是一款 极简,灵活, 高性能,扩建性强 的php 框架. 未开源之前在商业公司 经历数年,数个高并发网站 实践使用! 框架结构 整个框架核心四个文件,所有文件加起来放在一起总行数 ...
随机推荐
- PHP全栈开发(八):CSS Ⅲ background
设置背景颜色: div { background-color:#b0c4de; } 不仅可以给body标签设置背景颜色,还能给p,div,h标签设置背景颜色 设置背景图片: body { backgr ...
- docker搭建个人云盘可道云kodbox
1.拉取kodbox镜像 (文章最后有自己编写yml文件可直接搭建) docker pull tznb/kodbox:1.15 2. 创建并启动kodbox docker run -d -it --n ...
- spring boot集成redis基础入门
redis 支持持久化数据,不仅支持key-value类型的数据,还拥有list,set,zset,hash等数据结构的存储. 可以进行master-slave模式的数据备份 更多redis相关文档请 ...
- 洛谷P2827 [NOIP2016 提高组] 蚯蚓 (二叉堆/队列)
容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的delta. 1.取出最大的x,x+=delta: 2.算出切断后的两个新长度,都减去delta和q: 3.del ...
- C语言------程设设计入门
仅供借鉴.仅供借鉴.仅供借鉴(整理了一下大一C语言每个章节的练习题.没得题目.只有程序了) 文章目录 1:程序设计入门 2 .实训目的及要求 3.代码实验(包含运行结果) 4 .实验总结 1:程序设计 ...
- ansible应用之安装elk框架
最近在学习ansible,先大致看了下视频,现在需要练习使用了.对照视频中的练习方式,我觉得用处也不是太大,正好现在还要学习elk,以集群方式部署es,需要执行一些批量命令,而且还有一些修改配置文件的 ...
- AngouriMath: 用于C#和F#的开源跨平台符号代数库
AngouriMath是一个MIT协议开源符号代数库.也就是说,通过AngouriMath,您可以自动求解方程.方程组.微分.从字符串解析.编译表达式.处理矩阵.查找极限.将表达式转换为LaTeX,以 ...
- C#实践炸飞机socket通信
一.前言 最近老师要求做课设,实现一个 "炸飞机" 游戏,我是负责UI界面实现和Socket通信实现的,在这里想总结一下我实现Socket的具体过程,对其中的产生的问题和实现的方法 ...
- 什么是 X.509 证书以及它是如何工作的?
X.509 证书是基于广泛接受的国际电信联盟 (ITU) X.509 标准的数字证书,该标准定义了公钥基础设施 (PKI) 证书的格式. 它们用于管理互联网通信和计算机网络中的身份和安全. 它们不显眼 ...
- Jenkinsfile 同时检出多个 Git 仓库
前置 通常,在 Jenkinsfile 中使用 Git 仓库是这样的: stage('Checkout git repo') { steps { checkout([ $class: 'GitSCM' ...