如何让 mplayer 从 stdin 播放?

如何让 mplayer 从 stdin 播放?

为什么这不起作用?

cat /dev/video1 | mplayer -

如果我能让它工作,那么我可以使用“tee”同时播放和录制视频来为 mplayer 和 mencoder 提供数据。

我想播放实时视频(来自 /dev/video1:input=1:norm=NTSC)并同时录制,而不引入延迟。

mplayer 可以正常播放视频(没有明显的延迟)。

mencoder 记录得很好。

但我不知道如何“tee”/dev/video 的输出,以便我可以同时将其提供给两者。 (我知道对其进行编码的方法,然后立即播放编码的视频,但这会带来太多的延迟)。

如果 mplayer 和 mencoder 可以从标准输入读取,那么我可以使用“tee”来解决这个问题。

我该怎么做?

[顺便说一句,我对任何同时播放和录制的解决方案都很满意,只要它不增加延迟 - 我不喜欢 mplayer。但先编码后播放会增加延迟。]

答案1

从标准输入播放时,您需要给它一些缓存

cat /dev/video1 | mplayer -cache 1024 -

如果没有该缓存选项,您将收到错误“查找失败无法在线性流中向后查找”

答案2

根据 mplayer 手册页mplayer -应该从标准输入读取,但您还需要指定-noconsolecontrols以防止 mplayer 尝试从标准输入读取键盘控制事件。

答案3

我认为使用单个 mplayer 不可能实现您想要做的事情。我发现这个问题被问到了,并且显然是这样回答的:

摘录:[MPlayer-users] 同时显示和记录摄像机 IP 流?

这项工作,但我真的想在同一个 mplayer 进程中完成它。知道如何在从属模式下将流写入文件吗?我还没有在文档中找到正确的命令。

我认为这是不可能的。 MPlayer可以播放或者转储一个流,而不是同时转储两者。

但是,您可以使用一个任务转储流,然后使用另一任务播放该录制流。至少你的网络流量不会增加两倍。

原问题这个答案是这样的:

同时,我需要显示流,以及将其写入文件的可能性(因此,记录它)。我的观点是:我想做的是同样的过程。

实际上,我有一个从属模式下的 mplayer 进程:

    $ mplayer -slave -wid id_window  camera_address/

每次我需要记录时,我都会启动一个新进程,这次不在从属进程中:

    $ mplayer -dumpvideo camera_address -dumpfile stream.mp4/

这项工作,但我真的想在同一个 mplayer 进程中完成它。知道如何在从属模式下将流写入文件吗?我还没有在文档中找到正确的命令。

使用 ffmpeg 吗?

只是一个想法,但我在 ffmpeg 网站上找到了这篇 wiki 帖子,其中讨论了创建多个输出。也许您可以拆分/dev/video1然后在 mplayer 中使用重复的流?

答案4

8 年多后,我应该发布我找到的解决方案。

使用Python。 AFAICT,仅使用标准 Linux 工具是不可能实现这一点的。

如果您正在阅读本文,最好不要再用头撞墙了。

非常粗略地说 - 使用 pygame (import pygame) 读取相机并显示视频,并使用 OpenCV (import cv2) 保存视频。这有效。

相关内容