2017-05-26 254 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加密。 –