2017-05-26 2 views
7

J'essaye de mettre en place un service de streaming en utilisant Nginx-rtmp. Le fichier de configuration estFlux RTMP via http

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; 
     } 
    } 
} 

Je veux que le service de streaming passe par http pas rtmp. Finalement, nous voulons que le client se connecte à un serveur proxy en utilisant https, puis le serveur proxy parle au serveur de streaming en utilisant rtmp. Je teste en utilisant HTTP pour le moment. Je me suis donc un HAProxy en utilisant la configuration suivante:

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 

je peux accéder au service de diffusion en continu en utilisant uri de RTMP: // the_ip: 1935/vod2/gua.mp4 dans un lecteur VLC. Mais peu importe ce que j'ai essayé, cela ne fonctionne pas lorsque j'ai essayé d'accéder à la diffusion en utilisant http://the_ip:80/vod2/gua.mp4.

Est-ce encore possible?

Merci beaucoup!

Répondre

1

HTTP et RTMP sont deux choses différentes. Il n'y a aucun moyen de transférer le paquet RTMP via HTTP, car si un client envoie une requête HTTP, le serveur retournera une réponse HTTP et ensuite le client consommera le paquet HTTP. En théorie, le client peut alors déballer le paquet HTTP, mais cela nécessiterait un travail supplémentaire.

Une meilleure solution consiste à utiliser HTTP Live Streaming (HLS). nginx-vod-module prend en charge HLS. Il peut être facilement configuré dans le fichier de configuration. Quand une vidéo est placée dans le serveur, le client peut utiliser une URL comme http://127.0.0.1/vod/sample.mp4/index.m3u8. Le serveur Nginx partitionne automatiquement la vidéo en package HTTP et fournit une playlist. Donc, le client peut le jouer. HLS est largement supporté par de nombreux lecteurs open source (pour les navigateurs) et des appareils mobiles (ios et Android). Et il peut être facilement configuré avec HTTPS pour une transformation sécurisée.

3

Eh bien, le client vidéo (dans votre cas VLC Player) doit savoir de quel protocole il essaie de lire le flux. Donc, en bref, non. Vous devrez modifier le client pour qu'il sache qu'il reçoit le contenu RTMP et non le protocole HTTP. Sur une note de côté, vous pouvez essayer d'utiliser le port 80 pour le serveur RTMP? Mais généralement, ce n'est pas une bonne idée de voler le port de HTTP, mais la vidéo serait en effet transférée via le port 80 (mais n'utilisant pas le protocole HTTP).

Maintenant, si vous voulez passer le contenu RTMP via le corps de HTTP (en utilisant votre proxy serveur), le client doit également convertir les paquets entrants en RTMP. De cette façon, c'est possible, mais encore une fois, vous aurez besoin d'un proxy à la fois côté serveur et côté client pour convertir chaque paquet. Rappelez-vous cependant que RTMP a été conçu comme un protocole de streaming en temps réel, donc l'utilisation de HTTP comme proxy diminuerait considérablement ses performances.

Il existe également RTMPT, qui tunnelise les paquets RTMP via le protocole HTTP. Il a été fait pour contourner les pare-feux et la plupart des filtres de trafic d'entreprise, mais il a adds latency et a peu de soutien global. Je pense Red5 streaming server supports it. J'ai également vu des cas où des pare-feu bloquent des paquets HTTP suspects et qui pourraient causer des problèmes avec RTMPT en raison de la perte de paquets et de l'instabilité en général.

+0

Merci! Des suggestions pour un outil/configuration qui peut être utilisé pour le streaming rtmps? – Ryan

+1

Eh bien, vous pouvez essayer RTMPT, qui est essentiellement RTMP tunnelisé sur HTTP. Je ne sais pas comment le chiffrement fonctionnerait avec RTMPT cependant. –