一款极简的流媒体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的同比缩放)的格式展示视频、音乐文件
  • 文件管理:文件删除、文件重命名

内容导览

快速预览

列表模式

在列表模式下删除文件

列表模式下重命名文件

宫格模式

宫格模式下的实时播放

环境检查与配置

主要步骤

  1. 设置系统编码
  2. 安装Java以及配置环境变量
  3. 安装以及配置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指定的目录是视频文件的存放地点

部署

  1. 下载源码包:https://github.com/HackyleShawe/StreamingMediaWebServer
  2. 将其解压,重命名为一个简单的名字,我重命名为:ms,意为Media Server
  3. 复制ms到到%Tomcat%/webapps/
  4. 编辑WEB-INF/config.properties文件,指定为在配置Tomcat事conf/server.xml中指定静态资源的目录,也即docBase的值
  5. 启动Tomcat,指定%Tomcat%/bin/shartup.bat
  6. 访问项目:http://localhost:8080/ms/

首次访问

代码设计

设计思想

  1. 创建一个专门存放视频文件的目录,例如:D:\A03-Program\A-Programming\Media
  2. 配置Tomcat将所有的静态资源请求全部解析到该个文件夹下
  3. 写一个JSP来读取该目录下的所有媒体文件
  4. 点击媒体文件后,经过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),提供视频音乐的在线播放功能的更多相关文章

  1. Resty 一款极简的restful轻量级的web框架

    https://github.com/Dreampie/Resty Resty 一款极简的restful轻量级的web框架 开发文档 如果你还不是很了解restful,或者认为restful只是一种规 ...

  2. Tomcat Web服务器与常用Web服务器

    一.常用Web服务器 Tomcat ​ 由Apache组织提供的一种Web服务器,提供对jsp和servlet的支持.它是一种轻量级的javaWeb容器服务器.也是当前应用最广的JavaWeb服务器( ...

  3. Linux上部署web服务器并发布web项目-转

    Linux上部署web服务器并发布web项目   近在学习如何在linux上搭建web服务器来发布web项目,由于本人是linux新手,所以中间入了不少坑,搞了好久才搞出点成果.以下是具体的详细步骤以 ...

  4. Linux上部署web服务器并发布web项目

    近在学习如何在linux上搭建web服务器来发布web项目,由于本人是linux新手,所以中间入了不少坑,搞了好久才搞出点成果.以下是具体的详细步骤以及我对此做的一些总结和个人的一些见解,希望对跟我一 ...

  5. 【股票盯盘软件】01_程序员炒股之开发一款极简风格的股票盯盘软件StockDog_V1.0.0.1

    1.前言 话说最近一段时间受疫情的影响,股市各种妖魔横行.本人作为一个入股市不满三年的小韭菜,就有幸见证了好几次历史,也是满心惊喜,就权当是接受资本市场的再教育了吧. 小韭菜的炒股方法其实很简单,这两 ...

  6. 极简】如何在服务器上安装SSL证书?

    本文适合任何人了解,图形化操作.下面以腾讯云为例,并且服务器(linux)也安装了宝塔面板. 1.登陆腾讯云账号进入控制台,找到SSL的产品 2.按要求申请并填写表单,记住私钥密码 3.提交后,待腾讯 ...

  7. Node.js 极简入门Helloworld版服务器例子

    粗浅得很,纯属备忘. // 内置http模块,提供了http服务器和客户端功能(path模块也是内置模块,而mime是附加模块) var http=require("http"); ...

  8. 极简SpringBoot指南-Chapter03-基于SpringBoot的Web服务

    仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...

  9. 5款极简极美WordPress主题,亲测可用附送源码

    2020年深冬,新闻上报道是.从1950年以来最寒冷的冬天. 一个周六的下午,我找遍了全网的简约博客主题,搭建了三年来的第7个独立博客, 多么难得的周末啊,我却在家花了一整天的时间.整理出直接套用5️ ...

  10. php 极简框架ES发布(代码总和不到 400 行)

    ES 框架简介 ES 是一款 极简,灵活, 高性能,扩建性强 的php 框架. 未开源之前在商业公司 经历数年,数个高并发网站 实践使用! 框架结构 整个框架核心四个文件,所有文件加起来放在一起总行数 ...

随机推荐

  1. spring boot集成redis基础入门

    redis 支持持久化数据,不仅支持key-value类型的数据,还拥有list,set,zset,hash等数据结构的存储. 可以进行master-slave模式的数据备份 更多redis相关文档请 ...

  2. 洛谷P2216 HAOI2007 理想的正方形 (单调队列)

    题目就是要求在n*m的矩形中找出一个k*k的正方形(理想正方形),使得这个正方形内最值之差最小(就是要维护最大值和最小值),显然我们可以用单调队列维护. 但是二维平面上单调队列怎么用? 我们先对行处理 ...

  3. 【JavaScript排序】 sort()方法(解决null、undefined、0之间的排序(混乱)问题)

    JavaScript排序 - sort()方法 --解决null.undefined.0之间的排序(混乱)问题 一.普通的数组排序 ​ JavaScript中用方法sort()为数组排序.sort() ...

  4. LeNet-论文阅读

    概述 Yann LeCun, Leon Bottou, Yoshua Bengio, and Patrick Haffner的论文<Gradient-Based Learning Applied ...

  5. CURL提交--POST/GET-带header信息

    function https_request($url, $param, $data = '', $method = 'GET', $headers = '') { $opts = array( CU ...

  6. 如何使用IDEA自动生成类图

    然后再类里边按 Ctrl+Alt+U 然后就会生成类图,这个样子 然后怎样把生成的类图搞出来.当然是使用截图软件啦.微信上的截图软件和qq上的截图软件好像都不在阔以,你一点击截图按钮.生成的类图就会消 ...

  7. 齐博x1会员中心如何加标签

    点击查看大图 轻松几步,你可以做会员中心的界面 这是调用文章的 代码如下:会员中心的标签跟前台使用方法是一模一样的, 关键之处就是多了一项动态参数 union="uid" 在以往, ...

  8. 在ubuntu 上安装golang

    https://golang.google.cn/dl/ 方式一 下载安装包 wget https://golang.google.cn/dl/go1.19.linux-amd64.tar.gz 解压 ...

  9. 真正“搞”懂HTTP协议03之时间穿梭

    上一篇我们简单的介绍了一下DoD模型和OSI模型,还着重的讲解了TCP的三次握手和四次挥手,让我们在空间层面,稍稍宏观的了解了HTTP所依赖的底层模型,那么这一篇,我们来追溯一下HTTP的历史,看一看 ...

  10. MPC:百万富翁问题

    学习文章:"一起学MPC:(一)百万富翁问题"和"[隐私计算笔谈]MPC系列专题(一):安全多方计算应用场景一览" 百万富翁问题 将问题具体化: Alice有\ ...