Re: IPC::Open3 and output

2017-07-09 Thread Chas. Owens
On Sun, Jul 9, 2017, 19:37 Mike Martin  wrote:

> Hi
> I am trying to use Open3 to capture stderr and avoiding the shell ie:
> my $str="-v 35 -i /data/Downloads/testinput.mp4 -c:v libx264 -preset fast
> -crf 28 -g 25  -c:a  libmp3lame -b:a 128000  -threads 4 -af volume=2.5  -vf
> scale='352:trunc(ow/((1/sar)*dar)/2)*2',fps='fps= 20',setsar='1/1'
> -profile:a aac_he_v2 -strict -2 -y /home/mike/testopen.mp4";
>   use Text::ParseWords;
> @args = quotewords('\s+', "'", $str);
>
> use IPC::Open3;
>
> local(*HIS_IN, *HIS_OUT, *ERR);
> my $cmd='ffmpeg';
> my $pid=open3(undef, undef, *ERR,$cmd, @args) or die print "$!";
> my $line;
>
> while (sysread ERR, $line, 256){
> print $line;
> }
> waitpid($pid, 0);
>
> However the output is buffered for around 2 minutes at a time rather
> immediately being printed
>
> Is there any way around this
>

Are you certain the buffering is in the read from ERR and not in the print?
STDERR is not supposed to be buffered. Try adding

$| = 1;
Near the top of your program. That will turn off any buffering of the Perl
5 script's STDOUT.

By default, Perl 5 will buffer STDOUT if it isn't writing to a
pseudoterminal (eg if you are piping the output of the Perl 5 script to
something else like tee.)


IPC::Open3 and output

2017-07-09 Thread Mike Martin
Hi
I am trying to use Open3 to capture stderr and avoiding the shell ie:
my $str="-v 35 -i /data/Downloads/testinput.mp4 -c:v libx264 -preset fast
-crf 28 -g 25  -c:a  libmp3lame -b:a 128000  -threads 4 -af volume=2.5  -vf
scale='352:trunc(ow/((1/sar)*dar)/2)*2',fps='fps= 20',setsar='1/1'
-profile:a aac_he_v2 -strict -2 -y /home/mike/testopen.mp4";
  use Text::ParseWords;
@args = quotewords('\s+', "'", $str);

use IPC::Open3;

local(*HIS_IN, *HIS_OUT, *ERR);
my $cmd='ffmpeg';
my $pid=open3(undef, undef, *ERR,$cmd, @args) or die print "$!";
my $line;

while (sysread ERR, $line, 256){
print $line;
}
waitpid($pid, 0);

However the output is buffered for around 2 minutes at a time rather
immediately being printed

Is there any way around this