Forward RTSP stream to remote socket (RTSP Proxy?)

2019-01-28 10:33发布

问题:

My Apologies for the generality of the question. I have tried many things but nothing seems to work. I have a server? (let's call it Server A) that resides in a local area network where there is also an IP-Webcam. That webcam is constantly providing an RTSP feed on the address... let's say... rtsp://192.168.1.50:554/cam.sdp. The camera doesn't have access to the outside world (it must stay in the LAN, and therefore, only has access to server A, no to server B), but server A does. Sadly, Server A doesn't have a public IP, so I can not reach into Server A from anywhere in the world. Server A can go out if it wants but no one can get into Server A... (it's an spoiled brat... too many toys when it was a kid)

Now, there's another server (server B, to be original) in the aforementioned outside world which is a regular web server with its public IP and all. That server allows people to reach into it (not spoiled, very nice... sets the table, does the dishes... that kind of stuff). Both Server A and Server B are my computers and are running Ubuntu 12.04 and some Python applications I designed (Server B is actually running Django, but I don't think that's too relevant). What I mean by this is that I have control over what's going on in both servers. I can install/uninstall packages, I can open ports, close ports... whatever is needed (I can even format them if I want, although I don't think that would help much... or yes... who knows?)

                               _____________                                    _____________
    -----------                |           |                                    |           |   
 __ |         |                |           |                                    |           |     
|  \| WebCam  |================| Server A  |===========|  INTERNET  |===========| Server B  |
|__/|         | ->/cam.sdp  <--|           |----------------- > --------------> *           | 
    |         |                |___________|                                    |___________|
    -----------

The question is: How can I grab the RTSP stream with server A dump it onto a designated socket of server B and open it (with a program able to understand RTSP feeds, such as VLC)?

I'm guessing I need something like an RTSP proxy, maybe? But I don't really know where to start.

Any hint, link... would be appreciated.

Thank you in advance

回答1:

I don't know RTSP, but it seems to be a standard TCP-only protocol. Try to run on server A:

ssh -g -R 554:192.168.1.50:554 server_B_hostname

This will open the public port 554 on Server B, and forward it to 192.168.1.50:554 from A's point of view.

Some servers have sshd configured to refuse the ssh -g -R forwarding (for no good reason). If you can, you should check /etc/ssh/sshd_config on Server B and add AllowTcpForwarding yes.



回答2:

RTSP is a TCP controlling protocol towards a streaming server. The protocol uses OPTION commands to get info about the stream. When the client has enough info about the server and it's capabilities can send a PLAY command with a 'transport string' telling it. How to stream, Usually on UDP port 554. The client prior to send the PLAY, should be prepared to do recfrom(SRV UDP, PORT). There are transport commands that can make the server to stream on the TCP as well. Saying this I guess you can write your own RTSP+DATA proxy on the local NET. Keep in mind you have to pass also all the TCP headers going on all the time between parties, telling the client current frames, and such. On the 'CLOUD' server you need another custom software to be able to get what you send and expose itself as a rtsp source.