"Relaying" video streams

Bruce Dawson jbd at codemeta.com
Wed Nov 19 19:56:35 EST 2008


Frank DiPrete wrote:
> Bruce Dawson wrote:
>   
>> We've got several web cams that people like to visit
>> (www.milessmithfarm.net). However, they're chewing up bandwidth when
>> more than one person at a time views them.
>>
>> Is anyone aware of a Linux based video re-broadcaster (either software
>> or a service)?
>>
>> We'd like to upload the video streams to a single server that multiple
>> people can connect to and view them. This way, we're only sending one
>> video stream up to the server, and the server can rebroadcast it to all
>> the connected clients.
>>
>> --Bruce
>>     
>
> It sounds like the sources are live streams (web cams) and not files 
> that can be uploaded to another server for download / viewing.
>
> A multi unicast scenario.
>   
...

The above is correct.

> But we haven't solved the original problem yet.
> Item 1) starts a stream from the webcam so you still pound your uplink 
> for each request, but a little program logic may work here.
>   

I think we sorta solved it. I only want one stream going out, and then
the "repeater" (PHP) will repeat it to multiple clients.
> I've done this sort of thing with php.
> These code examples are for an flv source for a youtube re-creatiom 
> problem I worked on recently, but you would just change the mime / file 
> type.
>
> Your server could:
>
> 1) anchor the stream with php curl
>
> 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));
>   $fh = fopen($flv_file,"rb");
>   fseek($fh, $pos);
>   fpassthru($fh);
>   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)
>
> Including a player frame on the server page is another added fun bit.
> I used flowplayer and ffmpeg.
>
>   
OK. Thanks. I'll play with those. I'll probably "pipe" the output from
"proxy_stream" to shared memory so there will be only one connection.
Then have transmit_stream copy from the shared memory to the client.
This will avoid the problem of Apache/PHP creating a new proxy_stream
for each connection.

However, I'm concerned about corrupting data streams to the client if a
PHP process was unable to send out a shared memory segment.

--Bruce



More information about the gnhlug-discuss mailing list