如何使用 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.
提供的东西
我有一个 .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.