流媒体服务器部署
部署安装
1.更新系统
yum update -y
2.安装依赖组件
- 安装
git
git
用来拉去github
的软件包
yum install git -y
- 安装一系列编译环境
yum -y install gcc-c++
yum -y install pcre pcre-devel
yum -y install openssl openssl-devel
yum -y install zlib zlib-devel
- 安装
rtmp
模块和nginx
网站:nginx
—http://nginx.org/download
RTMP
-----https://github.com/arut/nginx-rtmp-module.git
可以在windows下载然后上传到目录/usr/local
下
或者直接使用命令
cd /usr/local
git clone https://github.com/arut/nginx-rtmp-module.git
wget http://nginx.org/download/nginx-1.24.0.tar.gz
3.解压
解压安装包
tar -zxvf nginx-1.24.0.tar.gz
4.编译安装(添加RTMP和openssl模块)
cd nginx-1.24.0
./configure --add-module=/usr/local/nginx-rtmp-module --with-http_ssl_module --with-http_mp4_module
make && make install
如果报以下错误
检查:依赖组件是否有安装报错的
上述.configure中rtmp模块路径是否正确
5.检查是否安装成功
启动nginx
/usr/local/nginx/sbin/nginx #启动
然后ps -ef |grep nginx,如下图则启动成功
关闭nginx
/usr/local/nginx/sbin/nginx -s stop
6.修改nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
在server块内添加以下内容,在http
块内,与其他location
同级
location /videos/ {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
#明确此目录需要支持的视频格式
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET';
add_header 'Access-Control-Allow-Headers' '*';
add_header 'Access-Control-Expose-Headers' '*';
#以上add_header 用来解决跨域问题
alias /usr/local/nginx/videos/; #映射路径
autoindex on; #目录索引
}
在nginx.conf
文件中添加rtmp
配置与http
模块同级
rtmp {
server {
listen 1935; # RTMP协议默认端口,可根据需要修改
chunk_size 5242800;
application videos{
play /usr/local/nginx/videos/;
meta copy;
}
}
}
此配置可支持rtmp协议,适用于推拉流场景和需要用到rtmp协议的情景
安装ffmpeg
安装依赖
yum install yasm -y
方法一
直接yum
装,源没有的话换下一个方法
yum install ffmpeg
方法二(centos适用)
yum install epel-release
yum install -y https://mirrors.ustc.edu.cn/rpmfusion/free/el/rpmfusion-free-release-8.noarch.rpm
yum install -y ffmpeg ffmpeg-devel
这个镜像是中国科技大学的开源软件镜像站,相对安全
epel-release(EPEL),是Fedora社区打造,为基于红帽、centos等企业级发行版linux提供的高质量软件包的一个项目,等于扩展了一个软件仓库
rpmfusion-free-release-8.noarch.rpm 中的8对应的是版本号 比如这个适用centos8
方法三
编译安装
cd ~ #切换到root主目录
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg //下载ffmpeg
cd ffmpeg
./configure --prefix=/usr/local/ffmpeg
make
make install
在编译执行./configure --prefix=/usr/local/ffmpeg
可能会报错nasm没有或者版本太老
yum install nasm
如果没有则手动编译安装
cd /usr/local
wget http://123.56.3.143:8888/download/nasm-2.16.03.tar.gz
解压编译
tar -zxvf nasm-2.16.03.tar.gz
cd nasm-2.16.03
./configure
make
make install
重新执行
./configure --prefix=/usr/local/ffmpeg
#编译时间挺久的耐心等待半小时
make
make install
拷贝ffmpeg命令(方便调用)
cp /usr/local/ffmpeg/bin/* /usr/bin/
将/usr/local/ffmpeg/bin/加到/etc/profile 环境变量也行,复制下方命令即可
echo “export PATH=$PATH:/usr/local/ffmpeg/bin” >> /etc/profile
source /etc/profile
ffmpeg相关使用命令
ffmpeg -i 本地视频地址 -y -c:v libx264 -strict -2 转换视频.mp4
ffmpeg -y -i 本地视频.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 转换视频.ts
ffmpeg -i 本地视频.ts -c copy -map 0 -f segment -segment_list 视频索引.m3u8 -segment_time 5 前缀-%03d.ts
#-segment_time 切片时长,例子为5秒
#前缀-%03d.ts 输出ts格式为 前缀-001.ts、前缀-002.ts, %03d代表3位数
ffmpeg -i 加视频 可以输出各种信息 format部分的duration是时长信息
知识拓展
HLS 是苹果公司推出的一种流媒体传输协议。它的工作原理是将整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一部分。这样的设计使得它能够很好地适应不同的网络状况,比如在网络带宽波动时,依然可以比较流畅地播放视频。
m3u8 + ts分片采用了HLS协议,即m3u8为索引文件,ts为小分片,m3u8是众多ts格式视频URL的集合,
苹果自带浏览器可直接访问m3u8格式文件,而无需第三方播放器,可用来判断流媒体服务器是否搭建成功
测试
将一个mp4上传到 /usr/local/nginx/videos
目录
cd /usr/local/nginx/videos
ffmpeg -i 上传的视频.mp4 -c copy -map 0 -f segment -segment_list 视频索引.m3u8 -segment_time 5 前缀-%03d.ts
方法一:浏览器访问 serverIP/videos
点击.m3u8
格式结尾的视频看是否能下载
方法二:苹果浏览器直接访问这个serverIP/videos/视频索引.m3u8
观察是否能播放
方法三:VLC第三方播放器 点击左上角----媒体----打开网络窜流-----网络----输入URLserverIP/videos/视频索引.m3u8
问题:访问videos目录报404
检查video
目录是否在/usr/local/nginx/
下
给videos
权限 chmod 644 -R /usr/local/nginx/videos
Nginx统一管理命令
1.创建nginx.sh
mkdir /usr/local/nomaxbin/ 创建脚本目录
touch /usr/local/nomaxbin/nginx.sh 创建脚本文件
vim /usr/local/nomaxbin/nginx.sh 编辑脚本文件
nginx.sh
内容如下
#!/bin/sh
# nginx统一管理脚本-add.yjc.2020年3月18日 10:58:58
# defined
DES="Nginx服务器"
NGNIX_PATH="/usr/local/nginx/sbin/"
# 切换目录
cd $NGNIX_PATH
NGNIX_COUNT=`ps -C nginx --no-header | wc -l`
if [ "$1" == "stop" ] || [ "$1" == "shutdown" ]; then
# 停止
if [ $NGNIX_COUNT -gt 0 ]; then
echo "正在停止..."
./nginx -s stop
echo "服务已停止,使用status命令查看状态。"
else
echo "服务目前处于停止状态,无需再次停止"
fi
elif [ "$1" == "start" ] || [ "$1" == "" ]; then
# 启动
if [ $NGNIX_COUNT -gt 0 ]; then
echo "服务正在运行,PID:"
cat ../logs/nginx.pid
else
echo "正在启动..."
./nginx
echo "服务已启动,使用status命令查看状态。"
fi
elif [ "$1" == "restart" ]; then
# 重启
if [ $NGNIX_COUNT -gt 0 ]; then
echo "正在停止服务..."
./nginx -s stop
echo "服务已停止。"
fi
NGNIX_COUNT=`ps -C nginx --no-header | wc -l`
echo "Watting..."
while [ $NGNIX_COUNT -gt 0 ]
do
sleep 2
NGNIX_COUNT=`ps -C nginx --no-header | wc -l`
echo "Watting..."
done
echo "正在启动服务..."
./nginx
echo "服务已启动,使用status命令查看状态。"
elif [ "$1" == "dellog" ]; then
# 重启
if [ $NGNIX_COUNT -gt 0 ]; then
echo "正在停止服务..."
./nginx -s stop
echo "服务已停止。"
fi
NGNIX_COUNT=`ps -C nginx --no-header | wc -l`
echo "Watting..."
while [ $NGNIX_COUNT -gt 0 ]
do
sleep 2
NGNIX_COUNT=`ps -C nginx --no-header | wc -l`
echo "Watting..."
done
echo "正在删除日志..."
rm -rf ../logs/*.log
echo "日志删除完成..."
echo "正在启动服务..."
./nginx
echo "服务已启动,使用status命令查看状态。"
elif [ "$1" == "log" ]; then
# 持续输出日志
tail -f ../logs/access.log
elif [ "$1" == "errlog" ]; then
# 持续输出日志
tail -f ../logs/error.log
elif [ "$1" == "status" ]; then
# 状态
if [ $NGNIX_COUNT -gt 0 ]; then
echo "服务正在运行,PID:"
cat ../logs/nginx.pid
else
echo "服务处于停止状态"
fi
elif [ "$1" == "help" ]; then
# 重新部署
echo "** "$DES
echo "** NGNIX_PATH:"$NGNIX_PATH
echo "----------------------------"
echo " start:启动"
echo " stop/shutdown:停止"
echo " restart:重启"
echo " log:持续输出控制台访问日志"
echo " errlog:持续输出控制台错误日志"
echo " status:服务运行状态"
echo " help:帮助说明"
echo " dellog:删除日志命令"
else
# error
echo "命令错误,请使用help命令查看具体使用说明"
fi
2.赋予执行权限
chmod +x /usr/local/nomaxbin/nginx.sh
3.配置环境变量
echo "export PATH=\$PATH:/usr/local/nomaxbin" >> /etc/profile
source /etc/profile 更新环境变量
4.执行命令
# 启动
nginx start
# 停止
nginx stop
nginx shutdown
# 重启
nginx restart
# 持续输出控制台访问日志
nginx log
# 持续输出控制台错误日志
nginx errlog
# 服务运行状态
nginx status
# 帮助说明
nginx help
# 删除日志命令
nginx dellog
``
2.赋予执行权限
chmod +x /usr/local/nomaxbin/nginx.sh
3.配置环境变量
echo "export PATH=\$PATH:/usr/local/nomaxbin" >> /etc/profile
source /etc/profile 更新环境变量
4.执行命令
# 启动
nginx start
# 停止
nginx stop
nginx shutdown
# 重启
nginx restart
# 持续输出控制台访问日志
nginx log
# 持续输出控制台错误日志
nginx errlog
# 服务运行状态
nginx status
# 帮助说明
nginx help
# 删除日志命令
nginx dellog