RTMP streaming through http

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!


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.


HTTP and RTMP are two different things. There is no way to transfer RTMP package through HTTP, because if a client sends an HTTP request, the server will return an HTTP response and then the client would consume HTTP package. In theory, the client can then unpack the HTTP package, but there would require extra work.

A much better solution is using HTTP Live Streaming (HLS). nginx-vod-module supports HLS. It can be easily configured in the config file. When a video is put in the server, the client can use a URL like http://127.0.0.1/vod/sample.mp4/index.m3u8. The Nginx server automatically partitions the video to HTTP package and provide a playlist. So the client can play it. HLS is widely supported by many open source players (for browsers) and mobile devices (both ios and android). And it can be easily configured with HTTPS for secure transformation.

链接地址: http://www.djcxy.com/p/96310.html

上一篇: 如何使用Dynamodb进行基本聚合?

下一篇: 通过http进行RTMP流式传输