admin 管理员组

文章数量: 887628

记录一下这几个月搭建的过程,以备未来需要时回看。

〇、

私人云盘、私人影院就是某某网盘的本地版,把本地的存储空间暴露给公网,使得任何能上网的设备都可以自由的获取该资源。然后再加一个前端管理界面,附带文件管理,视频切片播放,图片浏览,生成文件缩略图,pdf查看,word、ppt、excel在线编辑等功能。不仅包含目前市面网盘的一切功能,甚至还有超出他们的功能。

目前私有云盘的应用大多开源,如nextcloud,seafile等。国内国外有数十款相关的应用,如kodcloud等。其主要收入来源于企业的私有定制,对于个人开发者当然是尽可能的免费。私人云盘的应用本质上就是提供一个文件管理前端,后端的文件传输主要依靠各大web服务器如nginx,apache等。因此,本地私有网盘既不提供存储,也不提供带宽,性能自然比不上主流的网络云盘。当然,主流的网络云盘如百度云,阿里云,google drive,onedrive等,即提供存储,又提供带宽,自然质量、费用更高。

一、搭建过程

由于一般的nas性能不如win系统,wls又占用内存、cpu,自然想到用win端直接部署服务器。

现在有很多服务器环境管理软件,如宝塔面板,xx面板,可以直接接管服务器的运维管理。win端也有很多管理软件,比较好用的是phpstudy,中文名小皮面板小皮面板(phpstudy) - 让天下没有难配的服务器环境!

 

 安装常用的后端软件,如mysql,nginx,php,redis,apache即可。

然后就是部署私有云盘,这里选择了kodcloud和h5ai,可道云是国内一家做的非常不错的私有云盘,功能非常多,支持很多文件的在线预览(甚至包含工程建模软件)。h5ai是一个多媒体播放器,主要用来预览图片和视频。h5ai有一个国人的修改版,可以支持hls切片播放+dplayer,直接秒杀xx云盘的在线播放功能,拖到哪都是秒播,不管你是4k还是8k的视频,只要把它切片成10s以内的几百kb片段,就算是2G网络也能看4k。。。甚至可以1s一个切片,只要不嫌文件数量多。

1. kodcloud部署

参考教程,可道云团队 - Powered by kodbox

(官方demo可道云-kodbox - Powered by kodbox)

下载服务端文件,并下载windows端客户端软件

​​​​​​下载 - 可道云-私有云存储&协同办公平台_企业网盘_企业云盘_网盘_云盘

解压到某目录,设置小皮面板路径

打开localhost:port,port就是设置的端口号。

然后进行相关设置。

上传下载优化

可道云KODExplorer-OpenAPI及开发文档_企业网盘_企业云盘_私有云_云盘_网盘

kodbox 可道云上传大文件(超过4G的)_可道云上传大文件失败_zhangbest5的博客-CSDN博客

封面生成 高级教程

 其他相关功能安装相应插件。

最终效果

2. h5ai服务器部署

h5ai服务器是一个多媒体服务器,可以播放本地的图片、视频。光有这些功能实在是太简陋了,而且h5原生的video标签性能极其拉胯。好几年前有一个国人对h5ai进行了修改,添加了dplayer插件和hls流媒体功能,播放视频的性能大大提升。(dplayer也是一个国人开发的非常厉害的播放器插件)

H5AI 部署、配置与美化 - Cyrus's Blog

路径设置:

public/js/scripts.js 文件定制

该文件是h5ai的后端代码打包编译生成的,国人的h5ai改编版本就是给h5ai添加了hls插件,然后修改了该文件的部分逻辑。如果要定制相关的播放逻辑,则需要修改以下部分。(在文件中搜索关键词filename即可定位这段代码)

return new Promise(function(t) {

				var fileurl = e.absHref;
				console.log(fileurl);
				var filepath = fileurl.slice(0,fileurl.lastIndexOf('/'));
				var filename = fileurl.slice(fileurl.lastIndexOf('/')+1);
				var filenotype = fileurl.slice(fileurl.lastIndexOf('/')+1,fileurl.lastIndexOf('.'));
				var m3u8 = filepath+"/.contents"+'/__'+filename+'__/video.m3u8';
				var sub = filepath+'/'+filenotype+'.vtt';

				function loadXMLDoc() {
				    var xmlhttp = new XMLHttpRequest();
				    xmlhttp.onreadystatechange = function() {
				        if (xmlhttp.readyState == 4) {
				            if (xmlhttp.status == 200) {
				                loadPlayer(m3u8);
				                console.log('m3u8 yes');
				            } else if (xmlhttp.status == 404) {
				                console.log('m3u8 no');
				                loadPlayer(fileurl);
				            } else {
				                console.log('other');
				            }
				        }
				    }
				    xmlhttp.open("GET", m3u8, true);
				    xmlhttp.send();
				}

这段代码的功能就是,对于某目录下的filename文件,当他是mp4文件或者mkv文件时,点击播放的时候,首先播放./.contents/__filename__/video.m3u8视频文件,这是一种流媒体格式,播放的是视频文件的某段切片。如果该路径不存在,那就播放原视频。

如果要修改这段逻辑,那就修改上面这段代码即可。

给视频文件切片的sh程序:(windows端安装git后使用命令sh xx.sh可以运行shell文件)

#!/bin/bash

BASEDIR="."

function hlsfile(){
	file="$1"
	suffix="${file##*.}"
	filename="${file##*/}"
	curdir="${file%/*}"
	file_name_without_suffix="${filename%.*}"
	if [[ "${file##*.}" == "mp4" || "${file##*.}" == "mkv" ]]; then

		m3u8dir="${curdir}/.contents/__${filename}__"
		
		if [[ ! -d "${m3u8dir}" && ! -f "${file}.aria2" ]]; then
			mkdir -p "${m3u8dir}"
			ffmpeg -i "${file}" -c copy -bsf:v h264_mp4toannexb -hls_time 6 -hls_list_size 0 -hls_segment_filename "${m3u8dir}/%04d.ts" "${m3u8dir}/video.m3u8" > /dev/null 2>&1
			
			echo "${file}"
			# echo "${suffix}"
			# echo "${filename}"
			# echo "${curdir}"
			# echo "${file_name_without_suffix}"
			# echo " "

			# echo 'Rikka' > "${file}"

            # 截取原视频开头最长30s,并保留原视频的修改日期
			file30="${curdir}/_30s_${file_name_without_suffix}.${suffix}"
			file30temp="${curdir}/temp/_30s_${file_name_without_suffix}.${suffix}"
			if [[ ! -e "$file30" && "${filename:0:5}" != "_30s_" ]]; then
				ffmpeg -ss 0:00 -i "${file}" -t 30 -c:v copy -c:a copy "${file30}" > /dev/null 2>&1
				touch -amcr "${file}" "${file30}" 
				mv -f "${file30}" "${file}"
			# touch -amcr "${file30temp}" "${file}"
			# rm -rf "${curdir}/temp"
			fi
            # 截取30s功能结束

		fi		
	fi
}


function scandir(){
	for dirfile in "$1"/*
	do
		if [[ -d "${dirfile}" && "${dirfile:0-5}" != "_h5ai" && "${dirfile:0-2}" != "__" ]]; then
				scandir "${dirfile}"
		else
			hlsfile "${dirfile}"
		fi
	done
}
scandir "${BASEDIR}"

echo "hls finish"

文件介绍

需要提前安装ffmpeg软件,并设置环境变量。

在某一路径下新建hls.sh文件,粘贴上述内容,然后powershell执行sh hls.sh后,执行视频切片功能。从当前目录开始,递归扫描所有的子目录,把所有存在的mp4文件和mkv文件切片,切片文件在当前目录的.contents文件夹里的同名文件夹下。

原文件会截取开头最长30s的部分,用于生成缩略图。截取功能是我自己添加的,原服务器附带的shell文件是没有这个功能的。这样会导致所有的视频都占用两份空间。当然,如果不需要这个功能,就把shell文件中的截取30s部分注释掉,然后在相应的目录执行shell文件即可。

执行效果:

 

 

 

 切片文件是切成了12s一个片段,如果想要修改切片的参数,只需修改hls.sh中的代码

ffmpeg -i "${file}" -c copy -bsf:v h264_mp4toannexb -hls_time 6 -hls_list_size 0 -hls_segment_filename "${m3u8dir}/%04d.ts" "${m3u8dir}/video.m3u8" > /dev/null 2>&1

相关参数自行百度

3. win服务端设备获取公网ip并设置ddns

这个可以参考之前我写的博客,威海校区内的校园网,windows设备均可以获取ipv6的公网IP,linux端无法获取,需要安装某些软件。安卓端流量可以获取ipv6地址,root以后安装某些软件可以从校园网获取ipv6地址。苹果端手机使用流量无法获取ipv6地址,校园网也不行。mac使用校园网可以获取ipv6地址。

然后在win端本地写一个ddns脚本,设置定期运行,在阿里云几块钱买一个域名解析到本地即可。实现暴露到公网。

最终就可以通过域名访问本地的私有云盘了。

 

我的私有云盘域名是v6.zsq1.xyz:8080,有兴趣的可以使用能获取ipv6的设备访问这个域名,申请注册账号体验。

本文标签: 私人 影院 kodcloud h5ai PHPStudy