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

(二)阿里雲架構

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM