人生中最幸福的事情,就是宅在家里看电影。尤其是在冬天,舒舒服服躺在被窝里,一桶泡面,一个电影,美。对于互联网时代,很多人都会购买爱奇艺、优酷、腾讯视频等网站的会员,一边观看高清的视频,一边看有趣的弹幕,也挺好。可是对于一些国外大片,国内一般都是删减后的。比如《权利的游戏》,由于存在删减,或多或少都会影响到人们的观影感受。为了观看完整版,很多人会下载到电脑上、或者是购买正版的DVD光碟。这样可以通过电脑或者电视来看。如果我想通过手机或者平板这类的移动设备观看,就需要先将文件拷贝到手机里面,这样就需要在拷贝文件的时候花费一些时间,看完了手动还要删掉,真麻烦。要是我在家里,也能够搭建一个类似爱奇艺、B站这种网站,通过手机的浏览器直接观看,想什么时候看,什么时候看,想看什么,看什么。再也也不用忍受广告,岂不美哉!据我所知,好像有一些nas厂商,提供这种完整的硬件设备,但是价格好像还是挺贵的。对于爱折腾的人来讲,完全可以自己搞一个。
另外,公司也可以通过这种技术,搭建一个本公司的学习网站。大家将自己购买的课程资料(视频、音频、pdf书籍),统一到一个位置,谁想学什么课程,可以直接在线观看,也可以自由下载。提高公司的学习氛围。
准备操作系统
准备基础环境
# systemctl stop firewalld
# 停用firewalld服务。
# systemctl disable firewalld
# 禁止firewalld服务开机启动。
# iptables -F
# 清空防火墙策略。
# iptables -vnL
# 验证一下结果。
# 保证没有没有任何防火墙策略。
# sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 禁用selinux。
# setenforce 0
# 临时禁用selinux。
# getenforce
# 验证一下结果。
# reboot
# 重启一下服务器。可以略过。
注意:使用“getenforce”命令检查一下,保证输出结果不是“Enforcing”即可。
注意:selinux一定要停。由于我忘记关了,大于2G的视频文件,提示,403权限拒绝。老马失蹄啊。
# 此处使用阿里云的yum源。如果不能联网,则需要配置自己离线的Yum源,或者自己编译Nginx。
# cd /etc/yum.repos.d
# rm -f ./*.repo
# curl http://mirrors.aliyun.com/repo/Centos-7.repo -o /etc/yum.repos.d/Centos-7.repo
# 配置base源。
# curl http://mirrors.aliyun.com/repo/epel-7.repo -o /etc/yum.repos.d/epel-7.repo
# 配置epel源。
# yum clean all
# yum repolist
# 验证一下yum源的配置情况。
# yum install nginx -y
# cd /usr/share/nginx/html
# rm -fr ./*
注意:如果用户自己编译Nginx的话,一定要启用“--with-http_mp4_module”。可以参考rpm包的编译参数(nginx -V)。
# vim /etc/nginx/nginx.conf
autoindex on;
autoindex_exact_size off; #文件大小从KB开始显示
autoindex_localtime on; #显示文件修改时间为服务器本地时间
autoindex_format html; #以html风格将目录展示在浏览器中
charset utf-8,gbk; #展示中文文件名
# 在“http”段中,添加如上5行配置。注意不要放错位置。不然可能会导致Nginx服务无法启动。
# systemctl restart nginx
# 重新加载Nginx配置文件。
# netstat -ntl|grep 80
# 验证一下服务的状态。
# 上传工具有很多,rz+sz、sftp、Sfx等等。
# cd /usr/share/nginx/html
# ls
# 验证一下上传结果。
注意:一定要保证是mp4格式的文件。
# http://${服务器的IP地址}
注意:目前这种环境,看起来有些简陋,美化页面的话,需要一些前端的知识。果然**知识就是力量啊!**找时间学一下前端。github上应该也有一些漂亮的前端页面。
注意:目前现有的功能比较基础,开始、暂停、下载、全屏等操作。
注意:一定要使用Chrome的浏览器。微软老东家,都准备放弃IE了,你们就不要坚守了。
注意:也可以通过手机浏览器访问,手机端我测试了Chrome和华为手机默认的浏览器,都可以在线播放。
格式转换
如果视频默认的编码就是是H264,并且是mp4后缀,以上操作就已经结束了。但是实际场景中,视频文件的封装格式有很多,并不一定是mp4,如果是其他格式,则需要转换一下格式。转换视频格式使用的是ffmpeg命令。ubuntu系统,应该可以直接“apt install ffmpeg”来安装。由于我们使用的是CentOS系统,所以需要下载二进制包。
# yum install -y wget
# 已安装,可以忽略。
# wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz
# 下载ffmpeg的二进制包。
# tar -xvf ffmpeg-git-amd64-static.tar.xz -C /usr/local
# 解压。
# cd /usr/local
# mv ffmpeg-git-20191022-amd64-static ffmpeg
# ln -sv /usr/local/ffmpeg/ffmpeg /usr/bin/ffmpeg
# 用于格式化视频的命令。
# ln -sv /usr/local/ffmpeg/ffprobe /usr/bin/ffpeobe
# 用于查看视频详情的命令。
# 上传一个非mp4的视频文件到服务器。
# ffmpeg命令的参数非常丰富,功能很多,如果用户不清楚的话,直接复制下面的命令,修改下文件名称即可。
# ffmpeg -i ./${视频名称} -vf scale=iw:-1 -r 20 /usr/share/nginx/html/${视频名称}.mp4
# 示例:ffmpeg -i ./my-sch.rmvb -vf scale=iw:-1 -r 20 /usr/share/nginx/html/my-sch.mp4
注意:格式转换比较消耗CPU。CPU资源充足的话,就会很快。
注意:经过测试,很多视频默认就是H264的编码,如果视频的mkv格式,修改文件后缀为mp4,即可直接播放。
注意:如果不清楚的话,可以直接使用下面的脚本。
3.批量转换
实际使用的过程中,视频可能会有很多,不可能一一确认文件的格式是否满足。我自己写了一个交单的脚本。如果不喜欢命令行转换的话,可以使用格式工厂转换,然后上传到服务器上即可。但是视频质量不如ffmpeg。
用法:
#!/bin/bash
#
# 将"${master_video_path}/video"目录下的视频文件,转换成为mp4的格式,并移动到/usr/share/nginx/html目录下。
#
export LANG=en_US.UTF-8
# 检索"${master_video_path}/video"目录下的视频文件。
find_video_file () {
cd ${master_video_path}
video_files=$(find ./video -type f)
[[ ${video_files} ]] || exit 2
}
# 检查视频格式,确定是否需要转码。
check_video_type () {
video_file=$1
cd ${master_video_path}
video_file_type=$(ffprobe ${video_file} 2>&1 | grep -Ec 'Stream.+Video.+h264')
echo ${video_file_type}
}
# 格式化视频文件为H264的编码。
change_video_type () {
cd ${master_video_path}
which ffmpeg &> /dev/null || echo "请安装ffmpeg命令,官网地址:http://ffmpeg.org/download.html。"
which ffprobe &> /dev/null || echo "请安装ffprobe命令,官网地址:http://ffmpeg.org/download.html。"
for video in $(echo ${video_files});do
[[ -f ${video} ]] || continue
video_type=$(check_video_type ${video})
video_name=$(echo ${video%.*})
video_name=$(echo ${video_name#*/*/})
video_name=$(echo ${target_video_path}/${video_name}.mp4)
if [[ ${video_type} == '0' ]];then
video_dir=$(echo ${video_name%/*})
mkdir -pv ${video_dir}
ffmpeg -i ${video} -vf scale=iw:-1 -r ${video_rate} ${video_name}
rm -f ${video}
echo "${video_name} 视频已经格式化完成。"
else
video_dir=$(echo ${video_name%/*})
mkdir -pv ${video_dir}
mv ${video} ${video_name}
fi
sleep 10
done
}
master_video_path='/data/video_directory'
target_video_path='/usr/share/nginx/html'
video_rate=25
[[ -d ${master_video_path} ]] || mkdir -p ${master_video_path}
[[ -d ${target_video_path} ]] || mkdir -p ${target_video_path}
find_video_file
change_video_type
# 注意:视频文件的名称有空格的话,会失败。
扩展:
在家里面,用户自己买一个树莓派,买几个硬盘,买一个硬盘柜,用户自己搭建一个私有云盘。按照上面的操作,搭建一个家用的视频点播服务,感觉对于喜欢看电影、视频的人来讲,还是挺实用的。
苹果的浏览器可能无法在线播放mp4的视频文件,他需要m3u8格式的视频,也可以通过ffmpeg命令来生成,此处忽略。
如果用户想要下载一个目录中资源可以使用wget -r --no-parent http://192.168.10.171/${目录名称}
命令来下载整个目录中的资源。
如果是自己家用,并发量不大,默认配置即可满足使用。如果不够,需要优化一下nginx的参数,可以自行百度。