一款极简的流媒体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. 基于雪花算法的增强版ID生成器

    sequence 基于雪花算法的增强版ID生成器 解决了时间回拨的问题 无需手动指定workId, 微服务环境自适应 可配置化 快速开始 依赖引入 <dependency> <gro ...

  2. 《吐血整理》高级系列教程-吃透Fiddler抓包教程(28)-Fiddler如何抓取Android7.0以上的Https包-下篇

    1.简介 虽然依旧能抓到大部分Android APP的HTTP/HTTPS包,但是别高兴的太早,有的APP为了防抓包,还做了很多操作:① 二次加密有的APP,在涉及到关键数据通信时,会将正文二次加密后 ...

  3. vulnhub靶场|NAPPING: 1.0.1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:NAPPING: 1.0.1,地址我这里设置的桥接,,下载地址:https://download.vulnhub.com/napping/nap ...

  4. flutter系列之:builder为构造器而生

    目录 简介 Builder StatefulBuilder LayoutBuilder 总结 简介 flutter中有很多种Builder,虽然所有的builder都是构造器,但是不同的builder ...

  5. 前端框架Vue------>第一天学习(2) v-if

    API:https://cn.vuejs.org/v2/api/#key 文章目录 5.条件渲染 5.1 . v-if 5.2 . v-else-if 6 .列表渲染 7 .事件监听 5.条件渲染 5 ...

  6. 学习Java AES加解密字符串和文件方法,然后写个简单工具类

    Reference Core Java Volume Ⅱ 10th Edition 1 对称加密 "Java密码扩展"包含了一个Cipher,它是所有密码算法的超类.通过getIn ...

  7. TensorFlow?PyTorch?Paddle?AI工具库生态之争:ONNX将一统天下

    作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 本文地址:https://www.showmeai.tech/artic ...

  8. C#和Halcon交互实现图片的放大和缩小

    [转载] C#和halcon实现图片的放大和缩小 e.Delta>0表示鼠标向上滚动,e.Delta<0表示向下滚动 要拖动的图像为Measure.currentImageL,可以更换. ...

  9. Kubernetes集群管理工具kubectl

    Kubernetes集群管理工具kubectl 概述 kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装和部署 命令格式 ...

  10. tekla软件安装教程

    Tekla2020 WIN10 64位安装步骤: 1.先使用"百度网盘客户端"下载Tekla2020_x64软件安装包到电脑磁盘,并鼠标右击进行解压缩,安装前先断开电脑网络,然后找 ...