Web直播系列4——ffmpeg實時推流+nginx負載均衡降低直播延時_1

不要急慢慢來發表於2018-04-05

前提:

 

電腦的系統為64位Ubuntu16.04TLS及系列文章2中所實現的簡易直播平臺https://blog.csdn.net/zzhang_12/article/details/79789482

目的:

在網路頻寬一定的情況下,從nginx,ffmpeg兩方面嘗試降低延時

Ubuntu下的實現方法:

  • 注意:在不從提高網路頻寬和改善硬體效能等方面著手,而是從修改nginx,ffmpegr引數等方面著手,可能會在降低延時的同時,也降低效能。

1)從ffmpeg推流方面來降低延時(ffmpeg會有40~50幀左右延時)

  • 關閉sync-lookahead
  • 降低rc-lookahead
  • 降低threads
  • 禁用rc-lookahead
  • 禁用b-frames
  • 縮小GOP
  • 開啟x264的 -preset fast/faster/verfast/superfast/ultrafast引數
  • 使用-tune zerolatency
  • 注意:使用方法8可以使延時降低只0-1幀之間,但畫面質量損失也最嚴重。個人使用過3,7,8有效。

2)從nginx伺服器方面來降低延時(本文遇到的情況是同時推多個視訊流)

  • 本文采用nginx+tomcat實現負載均衡來降低推流延時
  1. 區域網內有3臺Ip分別為10.0.0.118,10.0.0.119,10.0.0.120的伺服器。
  2. 在三臺伺服器上部署好同樣的推流專案,並在其中一臺伺服器上部署資料庫,其他兩臺伺服器遠端訪問。
  3. 在前文中已搭好nginx伺服器上(10.0.0.118)進行nginx配置檔案修改。
  4. 
     
    http {
        #include      /nginx/conf/naxsi_core.rules;
        include       mime.types;
        default_type  application/octet-stream;
    
        #Nginx是如何實現負載均衡的,Nginx的upstream目前支援以下幾種方式的分配
        #1、輪詢(預設)
        #每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
        #2、weight
        #指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。
        #2、ip_hash
        #每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
        #3、fair(第三方)
        #按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
        #4、url_hash(第三方)
        #按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。  
    
         upstream 10.0.0.118{
             server 10.0.0.118:8080 weight=2;
             server 10.0.0.119:8080 weight=1;
             server 10.0.0.120:8080 weight=1;
         }
    
        sendfile        off;
        #tcp_nopush     on;
    
        server_names_hash_bucket_size 128;
    
        client_body_timeout   10;
        client_header_timeout 10;
        keepalive_timeout     30;
        send_timeout          10;
        keepalive_requests    10;
    
        #gzip  on;
    
        server {
            listen       80;
            server_name  10.0.0.118;
    
    	 location / {
    		root   html; 
        	        index  index.html index.htm;
    		proxy_pass http://10.0.0.118;   
                           }
                }
    }
  5. 使用nginx -t檢查nginx.conf檔案是否有錯,並重啟nginx伺服器。
  • 注意:遠端訪問資料庫時如出現1130-host...is not allowed to connect to this Mysql server的問題時。
  1. 檢視是否MySQL Server繫結了本地地址
    gedit /etc/mysql/mysql.conf.d/mysqld.cnf
  2. 修改bind-address = 127.0.0.1為bind-address = 0.0.0.0
  3. 授權
    mysql -uroot -proot(密碼)
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.0.0.118' IDENTIFIED BY 'root' WITH GRANT OPTION;
  4. FLUSH PRIVILEGES重新整理該表。

參考:

https://blog.csdn.net/fireroll/article/details/51902018

https://blog.csdn.net/dylanzr/article/details/52135196

https://www.cnblogs.com/zwb121/p/7339182.html

相關文章