如何将 ffmpeg 的输出通过管道传输到 ffplay?

wim*_*wim 31 bash ffmpeg pipe

如何将 ffmpeg 的输出通过管道传输到 ffplay?

目前我在 bash 中使用了一种解决方法:

mkfifo spam
(ffplay spam 2> /dev/null &) ; capture /dev/stdout | ffmpeg -i - spam
Run Code Online (Sandbox Code Playgroud)

evi*_*oup 32

ffmpeg -i input.avi <options> -f matroska - | ffplay -
Run Code Online (Sandbox Code Playgroud)

将工作; 您需要为输出设置容器格式。这通常是使用 ffmpeg 设置的,查看您提供输出的扩展名,但在这里您必须使用-f. 我推荐 matroska (MKV),因为它几乎可以包含任何视频,所以无论你将它转码成什么,都应该能很好地工作。

请注意,如果您使用的是 Ubuntu 12.04,则 ffmpeg 已被 libav fork 取代,您应该使用avconvandavplay代替;否则语法相同。那里有一种 ffmpeg,但它被设计残废了。

  • Win10:错误发生为`pipe:: Invalid data found when processing inputK` 在 Power Shell 中,但在命令提示符下运行良好 (2认同)

jfg*_*956 21

我不知道是ffmpeg无法将数据输出到标准输出,还是ffplay无法从标准输入获取输入。

如果是ffmpeg不能将其数据输出到标准输出:

capture /dev/stdout | ffmpeg -i - >(ffplay 2> /dev/null)
Run Code Online (Sandbox Code Playgroud)

(您可能需要添加一个-参数,ffplay以便它从标准输入获取输入。)

如果它ffplay不能从标准输入中获取输入:

ffplay <(capture /dev/stdout | ffmpeg -i -) 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

有关<(command)>(command)构造的更多信息,请参阅bash 手册的进程替换部分。

  • 对我来说,如果没有用“-f”明确指定输出格式,这不起作用。如 https://ffmpeg.org/ffmpeg.html 上所述:“通常会自动检测输入文件的格式,并从输出文件的文件扩展名中猜测格式”。在给定的答案 ffmpeg 将无法猜测输出格式。所以我认为 ffmpeg 应该添加“-f fmt”。 (5认同)

mat*_*boy 13

ffmpeg 支持管道操作。请参阅此处的文档部分。

我不知道 ffplay 是如何工作的,但是要将 ffmpeg 的输出通过管道传输到标准输出,您可以将管道命令添加到 ffmpeg 命令的末尾。例子:

ffmpeg -i input.flv pipe:1 | ffplay -i -
Run Code Online (Sandbox Code Playgroud)

  • `管道:1` 与 `-`?`-` 适用于 ffmpeg 2.8.6。 (2认同)

rog*_*ack 11

看起来像正常的管道工作(至少在 Windows 中):

ffmpeg -i sintel.mpg -pix_fmt yuv420p -f rawvideo - | ffplay -f rawvideo -pix_fmt yuv420p -s 720x480 -
Run Code Online (Sandbox Code Playgroud)

虽然还没有尝试过更复杂的输入/输出......

ffmpeg -f dshow -i video=screen-capture-recorder -pix_fmt yuv420p -f mpegts - | ffplay -analyzeduration 10 -f mpegts -
Run Code Online (Sandbox Code Playgroud)

启动稍快

  • **我收到`无法为'pipe:'`找到合适的输出格式-我需要用`-f`指定一个编解码器。** (8认同)