一款极简的流媒体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. P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并 (树上差分+线段树合并)

    显然的树上差分问题,最后要我们求每个点数量最多的物品,考虑对每个点建议线段树,查询子树时将线段树合并可以得到答案. 用动态开点的方式建立线段树,注意离散化. 1 #include<bits/st ...

  2. FastJson序列化对象复杂时出错问题解决

    FastJson序列化对象复杂时出错问题解决 针对复杂的对象,如Map<String, List<Map<String, XxxObject<A, B, C>>&g ...

  3. Java中的名称命名规范

    包名:多单词组成时所有字母都小写:xxxyyyzzz 类名.接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz 变量名.方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首 ...

  4. 使用MVC的实现登录注册功能

    文章目录 1.视图层(View)页面的编写: 1.1.登录页面 1.2.注册页面 2.控制层(Controller)的编写 2.1. 注册 2.2 .登录 2.3 .实体类 3.Model层(Mode ...

  5. Windows Server 2012部署遇到的问题

    一.安装IIS提示"服务器管理器WinRM插件可能已损坏或丢失" 解决方案: 1.开启WinRM服务,添加ip监听 在服务中查看WinRM服务是否开启,如果没有开启则把该服务开启, ...

  6. 齐博x1标签实例:调用多个圈子同时调用贴子

    下面讲解,在首页,如何调用圈子的同时也调用他们相关的贴子. 单单调用圈子,就像调用文章一样,很多人都能轻松实现,比如下面的代码 {qb:tag name="xxx" type=&q ...

  7. 24.-Django生成csv文件及下载

    一.csv文件定义 逗号分隔值(comma-separated values, csv,有时页称字符分隔值,因为分分隔字符页可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本) 说明:可被常见 ...

  8. Unity坐标系入门

    一.坐标系的概念 Unity 世界坐标系采用左手坐标系,大拇指指向X轴(红色),食指指向Y轴(黄色),中指向手心方向歪曲90度表示Z轴(蓝色),同时Z轴也是物体前进方向,下图表示Unity的四种坐标系 ...

  9. RHCE习题

    RHCE习题 考试说明: RH294系统信息 在练习期间,您将操作下列虚拟系统: 真实机: foundation: kiosk:redhat root: Asimov workstation.lab. ...

  10. MYSQL ---mysql 数据导入与导出

    1.使用SQLyog导出MySQL中的数据库 打开SQLyog → 右击你想要保存的数据库 → 选择"Backup/Export"→ 选择"Backup Database ...