![如何将 ffmpeg 的输出传送到 ffplay?](https://linux22.com/image/1286126/%E5%A6%82%E4%BD%95%E5%B0%86%20ffmpeg%20%E7%9A%84%E8%BE%93%E5%87%BA%E4%BC%A0%E9%80%81%E5%88%B0%20ffplay%EF%BC%9F.png)
我如何将 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 取代,您应该改用avconv
and 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 -
启动速度稍微快一点