Jens Krämer

Streaming with Ruby

 |  streaming, http, vlc, ruby

Here’s a small script that distributes a live HTTP video stream to a number of clients. I use it to save upstream bandwidth when connecting multiple clients inside the LAN to a live stream outside the LAN.

The script acts like a proxy. It opens one HTTP connection to the remote server to get the stream, and listens for requests of local clients on a given port. Received data then will be delivered to all connected clients.

The great thing is that I didn’t expect to get this done with Ruby in the first place. I already had started looking into Java’s nio packages, when I found this post on ruby-talk.

Armed with the knowledge of how to use the ominous select call, putting things together was really easy.

Soccer time :-)

Use VLC to grab the image from a video4linux capable device, e.g. a TV card inside a box at home:

vlc -v v4l:/dev/video0:adev=/dev/dsp:audio=1:norm=pal:size=352x240:samplerate=44100 \
--sout '#transcode{vcodec=mp4v,vb=600,acodec=mpga,ab=64,deinterlace}:std{access=http,mux=ts,url=:443}'

The stream now will be accessible via HTTP on port 443. To make it accessible for multiple clients, you’ll need a proxy (like the one I hacked together) since the average DSL connection can only serve the stream once due to the poor upstream.

You might have to change the audio/video devices and the bitrates (vb and ab parameters) to match your setup and connection quality.

Above settings give a quite ok picture and sound quality and the resulting stream fits into 1MBit DSL upstream without problems.

Disclaimers:

Comments

You can use Markdown here.

For the sake of spam checking any data you submit, including your IP address, will be transferred to the US based Akismet web service (akismet.com). If that's not acceptable for you, you can also reach me by other means.