2017-05-26 303 views
7

我正在嘗試使用Nginx-rtmp進行流式傳輸服務。配置文件是通過http進行RTMP流式傳輸

rtmp { 
    server { 
     listen 1935; 

     chunk_size 4000; 

     # video on demand for flv files 
     application vod { 
      play /var/flvs; 
     } 

     # video on demand for mp4 files 
     application vod2 { 
      play /var/mp4s; 
     } 
    } 
} 

我希望流服務通過http不rtmp。最終,我們希望客戶端使用https連接到代理服務器,然後代理服務器使用rtmp與流媒體服務器通話。我現在正在使用HTTP進行測試。所以我成立了一個HAProxy的使用以下配置:

global 
    log /dev/log local0 
    log /dev/log local1 notice 
    chroot /var/lib/haproxy 
    stats socket /run/haproxy/admin.sock mode 660 level admin 
    stats timeout 30s 
    user haproxy 
    group haproxy 
    daemon 

    #tune.ssl.default-dh-param 2048 

    # Default SSL material locations 
    ca-base /etc/ssl/certs 
    crt-base /etc/ssl/private 

    # Default ciphers to use on SSL-enabled listening sockets. 
    # For more information, see ciphers(1SSL). This list is from: 
    # https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ 
    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS 
    ssl-default-bind-options no-sslv3 

defaults 
    log global 
    mode tcp 
    option httplog 
    option dontlognull 
     timeout connect 5000 
     timeout client 50000 
     timeout server 50000 
    errorfile 400 /etc/haproxy/errors/400.http 
    errorfile 403 /etc/haproxy/errors/403.http 
    errorfile 408 /etc/haproxy/errors/408.http 
    errorfile 500 /etc/haproxy/errors/500.http 
    errorfile 502 /etc/haproxy/errors/502.http 
    errorfile 503 /etc/haproxy/errors/503.http 
    errorfile 504 /etc/haproxy/errors/504.http 


frontend rtmp-80 
     bind *:80 
     default_backend rtmp-over-http 

backend rtmp-over-http 
     server media01 127.0.0.1:1935 check maxconn 200 

我可以訪問使用RTMP的URI進行流媒體業務:// the_ip:1935/VOD2/gua.mp4在VLC播放器。 但無論我嘗試過什麼,當我嘗試使用http://the_ip:80/vod2/gua.mp4訪問流時,它都不起作用。

這甚至可能嗎?

非常感謝!

回答

1

HTTP和RTMP是兩個不同的東西。無法通過HTTP傳輸RTMP包,因爲如果客戶端發送HTTP請求,服務器將返回HTTP響應,然後客戶端將使用HTTP包。理論上,客戶端可以解包HTTP包,但這需要額外的工作。

更好的解決方案是使用HTTP直播流(HLS)。 nginx-vod-module支持HLS。它可以在配置文件中輕鬆配置。將視頻放入服務器時,客戶端可以使用類似http://127.0.0.1/vod/sample.mp4/index.m3u8的URL。 Nginx服務器自動將視頻分割爲HTTP包並提供播放列表。所以客戶可以播放它。 HLS得到了許多開源播放器(用於瀏覽器)和移動設備(包括ios和android)的廣泛支持。並且可以使用HTTPS輕鬆配置以實現安全轉換。

3

那麼,視頻客戶端(你的情況下VLC播放器)必須知道它試圖從哪個協議讀取流。所以總之,沒有。你必須修改客戶端讓它知道它實際上是接收RTMP內容而不是HTTP。

請注意,您可以嘗試將端口80用於RTMP服務器?但通常竊取HTTP端口並不是一個好主意,但視頻確實會通過端口80傳輸(但不使用HTTP協議)。

現在,如果您想通過HTTP正文(使用您的服務器代理)傳遞RTMP內容,客戶端還需要將傳入數據包轉換爲RTMP。這樣就有可能,但是同樣需要在服務器和客戶端都使用代理來轉換每個數據包。請記住,雖然RTMP是作爲實時流式傳輸協議製作的,所以使用HTTP作爲代理會大大降低其性能。

還有RTMPT,它通過HTTP協議隧道RTMP數據包。它被設計爲繞過防火牆和大多數企業流量過濾,但它總體上幾乎不支持。我認爲Red5 streaming server supports it。我還遇到過防火牆阻止可疑HTTP數據包的情況,這可能會導致RTMPT出現一些問題,這是由於數據包丟失和一般情況下的不穩定性。

+0

謝謝!任何關於可用於rtmp流式傳輸的工具/設置的建議? – Ryan

+1

那麼,你可以嘗試尋找RTMPT,它基本上是通過HTTP隧道傳輸的。不過,我不知道如何使用RTMPT加密。 –