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

How to use output of FFMPEG as command line argument to an executable

我有一个 .wmv 文件,我想将其转换为 .wav 文件,我正在使用 ffmpeg 进行相同的操作,命令如下:

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

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

./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 -

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

./foo <(ffmpeg ...)

进程替换扩展为一个名称,foo 可以像打开任何其他文件一样打开该名称。 "file" 的内容是 ffmpeg.

的输出

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


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

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

如果编写 foo 是为了将 - 理解为标准输入的替代名称,则第四种情况会起作用。那是程序约定,不是 shell.

提供的东西