流媒体服务器部署
部署安装
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第三方播放器 点击左上角----媒体----打开网络窜流-----网络----输入url
serverip/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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论