如何将 ffmpeg 的输出传送到 ffplay?

如何将 ffmpeg 的输出传送到 ffplay?

我如何将 ffmpeg 的输出传送到 ffplay?

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

mkfifo spam
(ffplay spam 2> /dev/null &) ; capture /dev/stdout | ffmpeg -i - spam

答案1

我不知道它是否ffmpeg无法将其数据输出到标准输出,或者ffplay无法从标准输入获取其输入。

如果ffmpeg无法将其数据输出到标准输出:

capture /dev/stdout | ffmpeg -i - >(ffplay 2> /dev/null)

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

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

ffplay <(capture /dev/stdout | ffmpeg -i -) 2> /dev/null

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

答案2

ffmpeg -i input.avi <options> -f matroska - | ffplay -

可以;您需要为输出设置容器格式。这通常是使用 ffmpeg 来设置的,它会根据您为输出指定的扩展名进行设置,但在这里您必须使用 手动设置-f。我推荐 matroska (MKV),因为它可以包含几乎任何视频,因此无论您将其转码成什么格式,都应该可以完美运行。

请注意,如果您使用的是 Ubuntu 12.04,ffmpeg 已被 libav fork 取代,您应该改用avconvand avplay;语法完全相同。那里有一种类似 ffmpeg 的东西,但它的设计有缺陷。

答案3

ffmpeg 支持管道操作。请参阅文档的该部分这里

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

ffmpeg -i input.flv pipe:1 | ffplay -i -

答案4

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

ffmpeg -i sintel.mpg -pix_fmt yuv420p -f rawvideo - | ffplay -f rawvideo -pix_fmt yuv420p -s 720x480 -

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

ffmpeg -f dshow -i video=screen-capture-recorder -pix_fmt yuv420p -f mpegts - | ffplay -analyzeduration 10 -f mpegts -

启动速度稍微快一点

相关内容