使用Nginx搭建mp4在线视频点播服务

使用Nginx搭建mp4在线视频点播服务

场景介绍

人生中最幸福的事情,就是宅在家里看电影。尤其是在冬天,舒舒服服躺在被窝里,一桶泡面,一个电影,美。对于互联网时代,很多人都会购买爱奇艺、优酷、腾讯视频等网站的会员,一边观看高清的视频,一边看有趣的弹幕,也挺好。可是对于一些国外大片,国内一般都是删减后的。比如《权利的游戏》,由于存在删减,或多或少都会影响到人们的观影感受。为了观看完整版,很多人会下载到电脑上、或者是购买正版的DVD光碟。这样可以通过电脑或者电视来看。如果我想通过手机或者平板这类的移动设备观看,就需要先将文件拷贝到手机里面,这样就需要在拷贝文件的时候花费一些时间,看完了手动还要删掉,真麻烦。要是我在家里,也能够搭建一个类似爱奇艺、B站这种网站,通过手机的浏览器直接观看,想什么时候看,什么时候看,想看什么,看什么。再也也不用忍受广告,岂不美哉!据我所知,好像有一些nas厂商,提供这种完整的硬件设备,但是价格好像还是挺贵的。对于爱折腾的人来讲,完全可以自己搞一个。
另外,公司也可以通过这种技术,搭建一个本公司的学习网站。大家将自己购买的课程资料(视频、音频、pdf书籍),统一到一个位置,谁想学什么课程,可以直接在线观看,也可以自由下载。提高公司的学习氛围。

所需物品

  • 一台安装CentOS7.4的虚拟机(可以使用Windows操作系统)。
  • 使用Nginx搭建一个Web服务。
  • 使用ffmpeg命令将视频转换成指定的格式。
    注意:由于视频编码必须为H264,视频的封装格式必须为mp4,有的视频是不需要转换的。
  • 测试时间:2019-10-26

具体操作

准备操作系统

  1. 安装一台CentOS7.4的操作系统。【此处略过】
    注意:8版本的CentOS都已经发布了,所以不要再使用CentOS6了。CentOS7以上的应该都可以。

准备基础环境

  1. 停用防火墙。
# systemctl stop firewalld
    # 停用firewalld服务。
# systemctl disable firewalld
    # 禁止firewalld服务开机启动。
# iptables -F 
    # 清空防火墙策略。
# iptables -vnL
    # 验证一下结果。
    # 保证没有没有任何防火墙策略。

使用Nginx搭建mp4在线视频点播服务_第1张图片

  1. 停用selinux。
# sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config  
    # 禁用selinux。
# setenforce 0
    # 临时禁用selinux。
# getenforce  
    # 验证一下结果。
# reboot 
    # 重启一下服务器。可以略过。
注意:使用“getenforce”命令检查一下,保证输出结果不是“Enforcing”即可。
注意:selinux一定要停。由于我忘记关了,大于2G的视频文件,提示,403权限拒绝。老马失蹄啊。

在这里插入图片描述

  1. 配置YUM源
# 此处使用阿里云的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源的配置情况。

使用Nginx搭建mp4在线视频点播服务_第2张图片

  1. 安装Nginx
# yum install nginx -y
# cd /usr/share/nginx/html
# rm -fr ./*
注意:如果用户自己编译Nginx的话,一定要启用“--with-http_mp4_module”。可以参考rpm包的编译参数(nginx -V)。
  1. 修改Nginx的配置文件
# 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
    # 验证一下服务的状态。

使用Nginx搭建mp4在线视频点播服务_第3张图片

  1. 上传一个mp4后缀的文件到“/usr/share/nginx/html”目录下
# 上传工具有很多,rz+sz、sftp、Sfx等等。
# cd /usr/share/nginx/html
# ls 
    # 验证一下上传结果。
注意:一定要保证是mp4格式的文件。

在这里插入图片描述

  1. 通过Chrome浏览器测试一下
# http://${服务器的IP地址}
注意:目前这种环境,看起来有些简陋,美化页面的话,需要一些前端的知识。果然**知识就是力量啊!**找时间学一下前端。github上应该也有一些漂亮的前端页面。
注意:目前现有的功能比较基础,开始、暂停、下载、全屏等操作。
注意:一定要使用Chrome的浏览器。微软老东家,都准备放弃IE了,你们就不要坚守了。
注意:也可以通过手机浏览器访问,手机端我测试了Chrome和华为手机默认的浏览器,都可以在线播放。

使用Nginx搭建mp4在线视频点播服务_第4张图片

使用Nginx搭建mp4在线视频点播服务_第5张图片使用Nginx搭建mp4在线视频点播服务_第6张图片

格式转换

如果视频默认的编码就是是H264,并且是mp4后缀,以上操作就已经结束了。但是实际场景中,视频文件的封装格式有很多,并不一定是mp4,如果是其他格式,则需要转换一下格式。转换视频格式使用的是ffmpeg命令。ubuntu系统,应该可以直接“apt install ffmpeg”来安装。由于我们使用的是CentOS系统,所以需要下载二进制包。

  1. 安装ffmpeg命令
# 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
    # 用于查看视频详情的命令。
  1. 格式化视频文件
# 上传一个非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。
用法:

  • 新建一个“/data/video_directory”目录。
  • 然后将视频文件上传到该目录下。
  • 然后新建一个脚本文件“change_video_to_mp4.sh”。
  • 将下面内容复制到脚本中。
  • 赋予执行权限,然后执行脚本即可。
    注意:脚本我并没有测试太多遍。
#!/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的参数,可以自行百度。

你可能感兴趣的:(运维)