"Relaying" video streams

VirginSnow at vfemail.net VirginSnow at vfemail.net
Wed Nov 19 09:33:13 EST 2008


> Date: Wed, 19 Nov 2008 08:22:15 -0500
> From: Frank DiPrete <fdiprete at comcast.net>
> Cc: GNHLUG mailing list <gnhlug-discuss at mail.gnhlug.org>

> function proxy_stream($flv_url) {
> 
>   $curl_handle=curl_init();
>   curl_setopt($curl_handle, CURLOPT_URL, $flv_url );
>   curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,3);
>   curl_exec($curl_handle);
>   curl_close($curl_handle);
> 
> }
> 
> 2) take that output to a pipe and shove it down the browser's throat
> The important bit is the fpassthru function so as not to mangle the 
> stream but just send it out again raw.
> 
> function transmit_stream($flv_file) {
> 
>   $pos = 0;
> 
>   header("Content-Type: video/x-flv");
>   header('Content-Length: ' . filesize($flv_file));

Wait, how do you plan to get the content length for the stream?

>   $fh = fopen($flv_file,"rb");
>   fseek($fh, $pos);
>   fpassthru($fh);


For those on the list who don't know PHP, "rb" means binary read-only;
fpassthru reads $fh to EOF and stuffs it into the output buffer.

>   fclose($fh);
> 
> }
> 
> The trick now it to connect the ouput pipe from curl into the retransmit 
>    function instead of operating on files. If a pipe from a webcam in 
> proxy_stream() is already open, then don't call the curl function. In 
> theory it would work (haven't tried it yet)

This *might* work, if the stream was in a raw format and the
passthrough was done in blocks the size of a single video frame.  The
clients might not like jumping into a video stream mid-frame (which
could happen if you just start sending them stream data whenever they
connect).  The client would miss out on all the header information, as
well as loose frame sync.  Some codecs might be able to recover from
such an extraordinary lack of metadata.  It seems risky to depend on
that level of resilience in the codec.

One thing that might work is a SIP proxy (maybe Asterisk?) on a host
with high bandwidth available.  A single transmission to the proxy,
which could then conference everyone else in.  That could require
viewers to have videoconferencing software, which might be asking too
much.

Perhaps some kind of RPC to the server could be used to spawn a farm
of "mencoder" filters with "-aoc copy -ovc copy" and an appropriately
calculated "-sb" value.

Oh, I got it! (See?  You can solve any problem if you talk to yourself
enough!)

Have the video source (whatever machine is pulling the mpeg) count the
bytes and frames.  Then, every 5 seconds or so, transmit a sync report
to the proxy.  The proxy can then calculate and pass that "-sb" to
mencoder.  Giving the user the ability to join the feed with a 5
second resolution would probably be just fine.


More information about the gnhlug-discuss mailing list