开发者

Linux流媒体服务器部署流程

目录
  • 流媒体服务器部署
    • 部署安装
      • 1.更新系统
      • 2.安装依赖组件
      • 3.解压
      • 4.编译安装(添加RTMP和openssl模块)
      • 5.检查是否安装成功
      • 6.修改nginx配置文件
    • 安装ffmpeg
      • 安装依赖
      • 方法一
      • 方法二(Centos适用)
      • 方法三
    • ffmpeg相关使用命令
      • 测试
        • Nginx统一管理命令
          • 1.创建nginx.sh
          • 2.赋予执行权限
          • 3.配置环境变量
          • 4.执行命令
          • 2.赋予执行权限
          • 3.配置环境变量
          • 4.执行命令
      • 总结

        流媒体服务器部署

        部署安装

        1.更新系统

        yum update -www.devze.comy

        2.安装依赖组件

        1. 安装git

        git用来拉去github的软件包

        yum install git -y
        1. 安装一系列编译环境
        yum -y install gcc-c++ 
        yum -y install pcre pcre-devel
        yum -y install openssl openssl-devel
        yum -y install zlib zlib-devel
        1. 安装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		

        如果报以下错误

        Linux流媒体服务器部署流程

        • 检查:依赖组件是否有安装报错的
        • 上述.configure中rtmp模块路径是否正确

        5.检查是否安装成功

        启动nginx

        /usr/local/nginx/sbin/nginx #启动
        然后ps -ef |grep nginx,如下图则启动成功

        Linux流媒体服务器部署流程

        关闭nginx

        /usr/local/nginx/sbin/nginx -javascripts 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; #目录索引OZIOS
                        }

        Linux流媒体服务器部署流程

        nginx.conf文件中添加rtmp配置与http模块同级

        rtmp {
            server {
                listen 1935; # RTMP协议默认端口,可根据需要修改
                chunk_size 5242800;
                application videos{
                   play /usr/local/nginx/videos/; 
                   meta copy;
                           }
            }
        }

        Linux流媒体服务器部署流程

        此配置可支持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_COUNOZiOST -gt 0 ]  
            do  
                sleep 2
                NGNIX_COUNT=`pythonps -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

        总结

        以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

        0

        上一篇:

        下一篇:

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        最新运维

        运维排行榜