<div dir="ltr">I have a handler that transcodes video files using ffmpeg which all works fine. However, if the web client disconnects or otherwise stops reading from the socket, my handler will continue reading from the ffmpeg filehandle and writing out to the writer object until ffmpeg has completed the transcode.<div>
<br></div><div>This wouldn't be a problem is we lived in a perfect world where every web client would send a single request to a URL and not make additional requests until the first one had been completed, but of course we don't live in an ideal world,.. and I would prefer my webapp not kill the server it is running on my spawning off more CPU intensive processes than necessary.</div>
<div><br></div><div>Is there any way for me to determine how much data is sat waiting to be flushed to the web client so that if it exceeded a predetermined number of bytes I can assume that I should kill my ffmpeg file handle and exit the handler prematurely,.. or any other way to determine if the web client has gone away?</div>
<div><br></div><div>Apologies if I haven't explained myself especially articulately.</div><div><br></div><div>This is the handler in question:</div><div><br></div><div><div><font face="courier new, monospace"><b>get '/stream/:file/:format' => sub {</b></font></div>
<div><font face="courier new, monospace"><b>    my $file = params->{file};</b></font></div><div><b style="font-family:'courier new',monospace">    my $format = params->{format};</b><br></div><div><font face="courier new, monospace"><b><br>
</b></font></div><div><font face="courier new, monospace"><b>    return send_file(</b></font></div><div><font face="courier new, monospace"><b>        'favicon.ico',</b></font></div><div><font face="courier new, monospace"><b>        streaming => 1,</b></font></div>
<div><font face="courier new, monospace"><b>        callbacks => {</b></font></div><div><font face="courier new, monospace"><b>            override => sub {</b></font></div><div><font face="courier new, monospace"><b>                my ($respond, $response) = @_;</b></font></div>
<div><font face="courier new, monospace"><b><br></b></font></div><div><b style="font-family:'courier new',monospace">                my $mime = 'video/mp4';</b><br></div><div><font face="courier new, monospace"><b>                my @ffmpeg_args = qw(-threads 0 -i $file);</b></font></div>
<div><b style="font-family:'courier new',monospace"><br></b></div><div><b style="font-family:'courier new',monospace">                if (exists $ffmpeg_formats{$format}) {</b><br></div><div><font face="courier new, monospace"><b>                    $mime = 'video/' . $format;</b></font></div>
<div><font face="courier new, monospace"><b>                    push @ffmpeg_args, @{$ffmpeg_formats{$format}};</b></font></div><div><font face="courier new, monospace"><b>                } else {</b></font></div><div><font face="courier new, monospace"><b>                    push @ffmpeg_args, @{$ffmpeg_formats{mp4}};</b></font></div>
<div><font face="courier new, monospace"><b>                }</b></font></div><div><font face="courier new, monospace"><b>                push @ffmpeg_args, '-';</b></font></div><div><font face="courier new, monospace"><b><br>
</b></font></div><div><font face="courier new, monospace"><b>                my $writer = $respond->([200, ['Content-Type' => $mime]]);</b></font></div><div><font face="courier new, monospace"><b>                open(my $fh, '-|', join(' ', '/usr/bin/ffmpeg', @ffmpeg_args));</b></font></div>
<div><font face="courier new, monospace"><b>                my $buffer;</b></font></div><div><font face="courier new, monospace"><b>                while (read($fh, $buffer, 1024) ) {</b></font></div><div><font face="courier new, monospace"><b>                    $writer->write($buffer);</b></font></div>
<div><font face="courier new, monospace"><b>                }</b></font></div><div><font face="courier new, monospace"><b>                close($fh);</b></font></div><div><font face="courier new, monospace"><b>            },</b></font></div>
<div><font face="courier new, monospace"><b>        },</b></font></div><div><font face="courier new, monospace"><b>    );</b></font></div><div><font face="courier new, monospace"><b>};</b></font></div></div><div><br></div>
<div><div><br></div>-- <br><div dir="ltr">Nicola Worthington<br><div><a href="mailto:nicolaw@tfb.net" target="_blank">nicolaw@tfb.net</a><br></div><div><br></div></div>
</div></div>