如何将FFMPEG的输出用作可执行文件的命令行参数

时间:2017-02-22 21:31:59

标签: bash ffmpeg stdout

我有一个.wmv文件,我想将其转换为.wav文件,我使用的是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 -

1 个答案:

答案 0 :(得分:2)

我认为你的第二次尝试很接近:

./foo <(ffmpeg ...)

进程替换扩展为名称,foo可以像任何其他文件一样打开。这个&#34;文件的内容&#34;是ffmpeg的输出。

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

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

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

如果编写foo来理解-作为标准输入的替代名称,则第四种情况可行。这是一个程序约定,而不是shell提供的东西。