如何让ffmpeg将输出写入命名管道

7
我知道可以使用pipe:1pipe:2作为output_file参数,让ffmpeg将其输出写入stdoutstderr。请参考(文档)。

但是,如果我想让它写入命名管道,该怎么办呢?

如果不行,有没有一种方法可以将数据从stdout重定向到Linux中的命名管道?(类似于ffmpeg <parameters> | pipe123

这个问题是对此问题的跟进。

2个回答

18

你可以先创建一个命名管道,然后使用以下方法让 ffmpeg 将内容写入其中:

ffmpeg 输出到命名管道:


ffmpeg 输出到命名管道:

# mkfifo outpipe

# ffmpeg -i input_file.avi -f avi pipe:1 > outpipe
FFmpeg version 0.6.5, Copyright (c) 2000-2010 the FFmpeg developers
  built on Jan 29 2012 17:52:15 with gcc 4.4.5 20110214 (Red Hat 4.4.5-6)
...
[avi @ 0x1959670]non-interleaved AVI
Input #0, avi, from 'input_file.avi':
  Duration: 00:00:34.00, start: 0.000000, bitrate: 1433 kb/s
    Stream #0.0: Video: cinepak, yuv420p, 320x240, 15 tbr, 15 tbn, 15 tbc
    Stream #0.1: Audio: pcm_u8, 22050 Hz, 1 channels, u8, 176 kb/s
Output #0, avi, to 'pipe:1':
  Metadata:
    ISFT            : Lavf52.64.2
    Stream #0.0: Video: mpeg4, yuv420p, 320x240, q=2-31, 200 kb/s, 15 tbn, 15 tbc
    Stream #0.1: Audio: mp2, 22050 Hz, 1 channels, s16, 64 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press [q] to stop encoding
frame=  510 fps=  0 q=11.5 Lsize=    1292kB time=33.96 bitrate= 311.7kbits/s
video:1016kB audio:265kB global headers:0kB muxing overhead 0.835379%

读取名为 outpipe 的命名管道(Python 示例):

# python -c "import os; fifo_read = open('outpipe', 'r', 0); print fifo_read.read().splitlines()[0]"
RIFFAVI LIST<hdrlavih8j...
...

-- ab1


2

@ab77的回答很好,但是我自己遇到了一个重要的问题。我不知道在Linux或其他*nix上是否会出现这种情况,但在Mac OS X上,如果您没有在管道名称上放置适当的扩展名,则无法进行管道传输。因此,如果输出格式是mpeg,则管道应该被命名为outpipe.mpg


我也遇到了这个问题。我尝试添加扩展名,但没有帮助。

ffmpeg -f u16le -i hi.wav pipe:1 > outpipe.wav 仍然返回错误“pipe:1:无效参数”。

- MaxKonin
@MaxKonin 我认为这可能取决于你使用的 Unix 版本。我知道在 Mac OS X 上,pipe:1 对我有用。如果你在 pipe 文件上执行 ls -l,它应该具有权限 -> prw-r--r--。还可能需要有其他进程从管道中读取。 - Adam Freeman
错误在参数序列中。# ffmpeg -i hi.wav -f u16le pipe:1 > outpipe.wav。工作正常。 - MaxKonin
7
在输出之前,您需要使用“-f <格式>”告诉ffmpeg要使用哪种格式。通常它可以从文件扩展名猜测,但在这种情况下没有扩展名。 - Travis Britz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接