• FFmpeg学习(七)流媒体服务器搭建


    一:音视频直播架构介绍

    (一)直播产品种类

    泛娱乐化直播:大规模直播(没有互动),多为观看,可以使用该架构。支持rtmp、hls、http/flv
    实时互动直播:使用了RTP协议,与目前的学习协议不同;常用webrtc

    (二)泛娱乐化直播架构

    1.主播端发送信令到信令服务器,创建房间,返回房间地址 。
    2.主播向获取的房间地址推流
    3.也是主播端,同1,只是协议不同
    4.同2
    5.观众端要观看节目,也需要发送信令给信令服务器。获取到主播节目的媒体流的地址。
    6.观众端获取了主播节目流地址,就可以去流媒体云中去拉流。赞赏、聊天,发送给信令服务器处理。

    (三)实时互动直播架构

    左互动(内部用户互动)
    右收听(提供大规模用户直播架构)

    (四)直播客户架构

     

    (五)流媒体服务搭建介绍

    1.有多种搭建方式:下面介绍3种

    1.使用Nginx搭建本地流媒体服务器
    2.通过SRS搭建RTMP server;实现流媒体服务器网络集群
    3.CDN网络(现成的,商业化的),自己会扩容

    2.介绍Nginx

    二:本机搭建Nginx RTMP服务

    (一)下载资源

    1.nginx源码:http://nginx.org/en/download.html

    tar -xvf nginx-1.19.10.tar.gz

    2.下载ginx-rtmp-module:https://github.com/arut/nginx-rtmp-module

    git clone https://github.com/arut/nginx-rtmp-module.git

    (二)RTMP环境搭建 

    ./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module

    prefix指定安装路径,add-module添加新模块。

    make -j 4

    -j开启多进程编译。

    sudo make install

    (三)配置环境

    修改nginx下的配置文件nginx.conf 

    #rtmp服务
    rtmp {
        server {
            #指定服务端口
            listen 1935;
            chunk_size 4000; #RTMP协议中需要
            #指定流应用:名称自定义
            application mytv {
                live on;  #直播
                allow play all;  #允许直接进行播放
            }
        }
    }

    (四)启动服务

    sudo ./sbin/nginx -c conf/nginx.conf

    (五)推/拉流测试

    1.监听频道,进行拉流

    ffplay rtmp://localhost/mytv/room01  #mytv是起的流应用名称;room01是自定义频道

    也可以保存:

     ffmpeg -i rtmp://localhost/mytv/room01 -c copy out2.flv

    2.进行推流

    ffmpeg -re -i ./out.flv -c copy -f flv rtmp://localhost/mytv/room01

    注意:在直播系统中不可能直接让用户知道视频流地址,所以需要一个信令服务器进行资源管理!!

    三:SRS流媒体服务

    (一)SRS介绍 

    github地址:https://github.com/ossrs/srs

    (二)单机部署SRS服务器

    1.下载源码

    git clone https://gitee.com/winlinvip/srs.oschina.git srs &&
    cd srs/trunk && git remote set-url origin https://github.com/ossrs/srs.git && 
    git checkout 3.0release && git pull

    2.配置与编译

     ./configure --prefix=/usr/local/srs 
    make -j 4

    3.安装

    sudo make install

    conf:存放配置信息,比如srs.conf、origin.cluster.edge.conf边缘结点配置
    etc:存放脚本(可以设置自动启动)
    objs:编译好的程序,也有日志

     

    srs.conf

    # main config for srs.
    # @see full.conf for detail config.
    
    listen              1935;  #侦听端口
    max_connections     1000;  #支持最大连接数
    srs_log_tank        file;  #日志输出形式
    srs_log_file        ./objs/srs.log; #日志存放位置
    daemon              on;
    http_api {            
        enabled         on;
        listen          1985;
    }
    http_server {
        enabled         on;
        listen          8080;
        dir             ./objs/nginx/html;
    }
    stats {
        network         0;
        disk            sda sdb xvda xvdb;
    }
    vhost __defaultVhost__ {
        hls {
            enabled         on;
        }
        http_remux {
            enabled     on;
            mount       [vhost]/[app]/[stream].flv;
        }
    }

    origin.cluster.edge.conf:配置边缘节点与源站之间的关系 

    edge.conf:配置边缘节点

    # the config for srs origin-edge cluster
    # @see https://github.com/ossrs/srs/wiki/v1_CN_Edge
    # @see full.conf for detail config.
    
    listen              1935;
    max_connections     1000;
    pid                 objs/edge.pid;
    vhost __defaultVhost__ {
        cluster {
            mode            remote;
            origin          127.0.0.1:19350;  #配置源站信息
        }
    }

    4.启动

    ./objs/srs -c conf/srs.conf

    5.测试(同前面的nginx测试) 

    (三)RTMP中的URL与VHOST

    1.RTMP URL

    标准RTMP URL指的是最大兼容的RTMP URL,基本上所有的服务器和播放器都能识别的URL,和HTTP URL其实很相似,例如:

    HTTPSchemaHostPortAppStream
    http://192.168.1.10:80/players/srs_player.html http 192.168.1.10 80 players srs_player.html
    rtmp://192.168.1.10:1935/live/livestream rtmp 192.168.1.10 1935 live livestream

    其中:

    • Schema:协议头,HTTP为HTTP或HTTPS,RTMP为RTMP/RTMPS/RTMPE/RTMPT等众多协议,还有新出的RTMFP。
    • Host:主机,表示要连接的主机,可以为主机DNS名称或者IP地址。商用时,一般不会用IP地址,而是DNS名称,这样可以用CDN分发内容(CDN一般使用DNS调度,即不同网络和地理位置的用户,通过DNS解析到的IP不一样,实现用户的就近访问)。
    • Port:端口,HTTP默认为80,RTMP默认为1935。当端口没有指定时,使用默认端口。
    • Path:路径,HTTP访问的文件路径。
    • App:RTMP的Application(应用)名称,可以类比为文件夹。以文件夹来分类不同的流,没有特殊约定,可以任意划分。
    • Stream:RTMP的Stream(流)名称,可以类比为文件

    2.Vhost

    RTMP的Vhost和HTTP的Vhost概念是一样的:虚拟主机。详见下表(假设域名demo.srs.com被解析到IP为192.168.1.10的服务器):

    HTTPHostPortVhost
    http://demo.srs.com:80/players/srs_player.html 192.168.1.10 80 demo.srs.com
    rtmp://demo.srs.com:1935/live/livestream 192.168.1.10 1935 demo.srs.com

    Vhost主要的作用是:

    • 支持多用户:当一台服务器需要服务多个客户,譬如CDN有cctv(央视)和wasu(华数传媒)两个客户时,如何隔离他们两个的资源?相当于不同的用户共用一台计算机,他们可以在自己的文件系统建立同样的文件目录结构,但是彼此不会冲突。
    • 域名调度:CDN分发内容时,需要让用户访问离自己最近的边缘节点,边缘节点再从源站或上层节点获取数据,达到加速访问的效果。一般的做法就是Host是DNS域名,这样可以根据用户的信息解析到不同的节点。
    • 支持多配置:有时候需要使用不同的配置,考虑一个支持多终端(PC/Apple/Android)的应用,PC上RTMP分发,Apple和Android是HLS分发,如何让PC延迟最低,同时HLS也能支持,而且终端播放时尽量地址一致(降低终端开发难度)?可以使用两个Vhost,PC和HLS;PC配置为最低延迟的RTMP,并且将流转发给HLS的Vhost,可以对音频转码(可能不是H264/AAC)后切片为HLS。PC和HLS这两个Vhost的配置肯定是不一样的,播放时,流名称是一样,只需要使用不同的Host就可以。
    listen              1935;
    vhost show.cctv.cn {
        chunk_size 128;
    }
    vhost show.wasu.cn {
        chunk_size 4906;
    }

    nginx配置虚拟主机vhost的方法详解

    (四)SRS集群部署

    1.部署图

    源节点:

    两个边缘节点:

    开启集群:

    sudo ./objs/srs -c conf/origin.conf
    sudo ./objs/srs -c conf/edge.conf
    sudo ./objs/srs -c conf/edge2.conf

    推流/拉流测试:

    ffmpeg -re -i ./out.flv -c copy -f flv rtmp://127.0.0.1:1935/mytv/room01

    ffplay rtmp://127.0.0.1:1936/mytv/room01

    四:CDN了解

    (一)CDN

    (二)阿里云架构

  • 相关阅读:
    【HDOJ】2267 How Many People Can Survive
    【HDOJ】2268 How To Use The Car
    【HDOJ】2266 How Many Equations Can You Find
    【POJ】2278 DNA Sequence
    【ZOJ】3430 Detect the Virus
    【HDOJ】2896 病毒侵袭
    求奇数的乘积
    平方和与立方和
    求数列的和
    水仙花数
  • 原文地址:https://www.cnblogs.com/ssyfj/p/14684510.html
Copyright © 2020-2023  润新知