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其实很相似,例如:
HTTP | Schema | Host | Port | App | Stream |
---|---|---|---|---|---|
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的服务器):
HTTP | Host | Port | Vhost |
---|---|---|---|
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
(二)阿里云架构