我有一个.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 -
答案 0 :(得分:2)
我认为你的第二次尝试很接近:
./foo <(ffmpeg ...)
进程替换扩展为名称,foo
可以像任何其他文件一样打开。这个&#34;文件的内容&#34;是ffmpeg
的输出。
但请注意,如果foo
需要可搜索文件,则无效; ffmpeg
的输出仍然是未在内存中缓冲的流。如果foo
期望能够在文件中来回移动,则需要使用实际文件。 (ffmpeg ... > tmp; ./foo tmp
)
在第一种情况下,您尝试将输出流的内容作为参数传递,类似于./foo "$(cat some.mp4)"
。
在第三种情况下,您将ffmpeg
的输出视为文件的名称。
如果编写foo
来理解-
作为标准输入的替代名称,则第四种情况可行。这是一个程序约定,而不是shell提供的东西。