FFmpeg学习(七)流媒体服务器搭建 nginx配置虚拟主机vhost的方法详解

时间:2024-03-02 15:06:07

一:音视频直播架构介绍

(一)直播产品种类

泛娱乐化直播:大规模直播(没有互动),多为观看,可以使用该架构。支持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;
}

(四)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

(二)阿里云架构