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.