1

我正在尝试运行 mplayer 系统命令以通过 Perl 脚本对视频进行编码,但无法正常工作

#!/usr/bin/perl
`"/usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>(/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log) input.mov"`;

如果我在 ssh 终端上运行

/usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>(/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log) input.mov

ssh 终端上的命令工作在 perl 脚本中不起作用

4

1 回答 1

4

Perl 脚本中有太多引号。咬着牙,我想你可以这样做:

#!/usr/bin/perl
`/usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>(/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log) input.mov`;

哦;你在那里有一个bash进程重定向。这使事情复杂化了;您不能像这样简单地将命令拆分:

#!/usr/bin/perl
my $x264 = "/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log";
exec "/usr/bin/mplayer", "-nosound", "-benchmark", "-vo",
      "yuv4mpeg:file=>($x264)",
      "input.mov";

这通常是最好的方法;这不适合你。

您可能最好还是使用:

#!/usr/bin/perl
system "/usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>(/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log) input.mov";

因为您真的对命令的输出不感兴趣。OTOH,真的没有理由像这样使用 Perl。最好写成:

#!/usr/bin/bash
/usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>(/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log) input.mov

可选地exec在命令前加上:

#!/usr/bin/bash
exec /usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>(/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log) input.mov

随着有关请求的原因和原因的信息不断涌现,我们观察到:

sh: 1: command : not found error output in perl script

的提及sh表明了问题的一部分。当bash作为 运行时sh,它不支持进程替换。鉴于这是更大的 Perl 脚本的一个片段,我们将继续努力从 Perl 运行命令。

#!/usr/bin/perl
use strict;
use warnings;

my $x264 = "/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log";
system "bash", "-c",
       "/usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>($x264) input.mov";
于 2013-06-16T02:32:17.600 回答