【问题标题】:How to use output of FFMPEG as command line argument to an executable如何使用 FFMPEG 的输出作为可执行文件的命令行参数
【发布时间】:2017-02-22 21:31:58
【问题描述】:

我有一个 .wmv 文件,我想将它转换为 .wav 文件,我正在使用 ffmpeg,命令如下:

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

pipe:1 在 STDOUT 中输出输出波形文件。我想从 STDOUT 捕获该波形文件并将其作为命令行参数传递给我的名为 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 -

【问题讨论】:

  • 为什么不直接通过管道从标准输入读取程序?
  • 可执行文件的设计不在我的控制范围内
  • 如何使用 bash 进程重定向?你的第二个例子,但只有&lt;(ffmpeg ...),而不是$()?结果类似于./foo /dev/fd/63,其中 fd 由命令的输出填充。
  • 哦,我太慢了,chepner 已经知道了。
  • ffmpeg -i file.wmv -ar 8000 -sample_fmt s16 -f wav - | ./foo /dev/stdin 是另一种选择,受制于与进程替换相关的大多数警告(FIFO、不可搜索等)

标签: bash ffmpeg stdout


【解决方案1】:

我认为您的第二次尝试已经接近:

./foo <(ffmpeg ...)

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

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


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

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

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

【讨论】:

  • 谢谢。但我对
  • 进程替换在某种意义上是一种创建临时文件的方式。试试echo &lt;(:): 是什么都不做的命令)。输出是进程替换创建的“文件”的名称。
猜你喜欢
  • 2011-08-25
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2012-09-28
相关资源
最近更新 更多