记录一下这几个月搭建的过程,以备未来需要时回看。
私人云盘、私人影院就是某某网盘的本地版,把本地的存储空间暴露给公网,使得任何能上网的设备都可以自由的获取该资源。然后再加一个前端管理界面,附带文件管理,视频切片播放,图片浏览,生成文件缩略图,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一个切片,只要不嫌文件数量多。
参考教程,可道云团队 - Powered by kodbox
(官方demo可道云-kodbox - Powered by kodbox)
下载服务端文件,并下载windows端客户端软件
下载 - 可道云-私有云存储&协同办公平台_企业网盘_企业云盘_网盘_云盘
解压到某目录,设置小皮面板路径
打开localhost:port,port就是设置的端口号。
然后进行相关设置。
上传下载优化
可道云KODExplorer-OpenAPI及开发文档_企业网盘_企业云盘_私有云_云盘_网盘
kodbox 可道云上传大文件(超过4G的)_可道云上传大文件失败_zhangbest5的博客-CSDN博客
封面生成 高级教程
其他相关功能安装相应插件。
最终效果
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
相关参数自行百度
这个可以参考之前我写的博客,威海校区内的校园网,windows设备均可以获取ipv6的公网IP,linux端无法获取,需要安装某些软件。安卓端流量可以获取ipv6地址,root以后安装某些软件可以从校园网获取ipv6地址。苹果端手机使用流量无法获取ipv6地址,校园网也不行。mac使用校园网可以获取ipv6地址。
然后在win端本地写一个ddns脚本,设置定期运行,在阿里云几块钱买一个域名解析到本地即可。实现暴露到公网。
最终就可以通过域名访问本地的私有云盘了。
我的私有云盘域名是v6.zsq1.xyz:8080,有兴趣的可以使用能获取ipv6的设备访问这个域名,申请注册账号体验。