RTMP streaming through http

Ryan picture Ryan · May 26, 2017 · Viewed 7.2k times · Source

I'm trying to set up a streaming service using Nginx-rtmp. The config file is

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

I want the streaming service go through http not rtmp. Eventually we want client to connect to a proxy server using https and then the proxy server talk to the streaming server using rtmp. I'm testing using HTTP for now. So I set up a HAProxy using the following config:

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 

I can access the streaming service using uri of rtmp://the_ip:1935/vod2/gua.mp4 in a VLC player. But no matter what I tried, it does not work when I tried to access the streaming using http://the_ip:80/vod2/gua.mp4.

Is this even possible?

Thanks so much!

Answer

Toribio picture Toribio · May 26, 2017

Well, the video client (in your case VLC Player) has to know which protocol it is trying to read the stream from. So in short, no. You'd have to modify the client to let it know it's actually receiving RTMP content and not HTTP.

On a side note, you can try to use port 80 for the RTMP server? But generally it's not a good idea to just steal HTTP's port but the video would indeed be transferred through port 80 (but not using HTTP's protocol).

Now if you want to pass RTMP content through HTTP's body (using your server proxy), the client also needs to convert the incoming packets to RTMP. This way it is possible, but again, you'd need a proxy both on the server and client side to convert each packet. Remember though that RTMP was made as a real-time streaming protocol, so using HTTP as a proxy would greatly decrease its performance.

There is also RTMPT, which tunnels RTMP packets through the HTTP protocol. It was made to bypass firewalls and most corporate traffic filtering, but it adds latency and has little support overall. I think Red5 streaming server supports it. I've also seen cases where firewalls block suspicious HTTP packets and that could cause some problems with RTMPT due to packet loss and instability in general.