2017-02-22 144 views
0

我有我想转换为.wav文件,我使用的ffmpeg一个相同的.wmv文件,命令如下:如何使用FFMPEG的输出作为命令行参数的可执行

ffmpeg -i file.wmv -ar 8000 -sample_fmt s16 -f wav pipe:1 

管道:1在STDOUT中输出输出波形文件。我想从STDOUT中捕获该wave文件,并将其作为命令行参数传递给名为foo的可执行文件。我想立即执行从wmv到wav的转换,而不是保存.wav文件。是 事情我都试过,但他们都不如下似乎工作:

./foo $(ffmpeg -i file.wmv -ar 8000 -sample_fmt s16 -f wav pipe:1) 

./foo $(<(ffmpeg -i file.wmv -ar 8000 -sample_fmt s16 -f wav pipe:1)) 

ffmpeg -i file.wmv -ar 8000 -sample_fmt s16 -f wav pipe:1 | xargs ./foo 

ffmpeg -i file.wmv -ar 8000 -sample_fmt s16 -f wav - | ./foo - 
+0

为什么不只是管它,让你的程序从标准输入读取? – AlG

+1

可执行文件的设计不在我的控制之中 – pku

+0

使用bash进程重定向怎么办?你的第二个例子,但只有'<(ffmpeg ...)',而不是'$('和')'?这样的结果看起来像'./foo/dev/fd/63',其中fd由命令的输出填充。 – ghoti

回答

2

我觉得你的第二次尝试接近:

./foo <(ffmpeg ...) 

的进程替换扩展到一个名字,foo可以打开像其他任何文件一样。这个“文件”的内容是ffmpeg的输出。

但是,请注意,如果foo需要一个可搜索的文件,则这不起作用; ffmpeg的输出仍然是不在内存中缓冲的流。如果foo希望能够在文件中来回移动,则需要使用实际文件。 (ffmpeg ... > tmp; ./foo tmp


在第一种情况,你正在试图在输出流的传递内容作为参数,类似于./foo "$(cat some.mp4)"

在第三种情况下,您将ffmpeg的输出视为文件的名称

如果编写foo以了解-作为标准输入的替代名称,则第四种情况将起作用。这是一个程序约定,而不是由shell提供的。

+0

谢谢。但对于<(ffmpeg ...)语法如何作为命令行参数而不是stdin,我有点困惑。 – pku

+0

从某种意义上说,进程替换是创建临时文件的一种方式。试试'echo <(:)'(':'是无所事事的命令)。输出是进程替换创建的“文件”的名称。 – chepner