我可以通过 ssh 传输 /dev/video

Ste*_*fan 35 ssh video ssh-tunneling

我有两台电脑,我办公室的台式机(连接了网络摄像头)和网络上其他地方的笔记本电脑。

通常我会通过我的网络摄像头通过运行来查看我的办公室

ssh Office -Y "mplayer tv://device=/dev/video0"
Run Code Online (Sandbox Code Playgroud)

从我的笔记本电脑。我不喜欢 Xforwarding mplayer,所以为什么我不能通过/dev/video在我的笔记本电脑上运行它来隧道到我的电脑?

sudo mkfifo /dev/video1
ssh Office 'dd if=/dev/video' | sudo dd of=/dev/video1'
Run Code Online (Sandbox Code Playgroud)

然后观看网络摄像头(在我的笔记本电脑上)

mplayer tv://device=/dev/video1
Run Code Online (Sandbox Code Playgroud)

eri*_*rik 22

如果您的带宽较低,我建议您压缩视频流(在 2020 年仍然有效)。

与ffmpeg和mplayer

ssh USERNAME@REMOTEHOST ffmpeg -an -f video4linux2 -s 640x480 -i /dev/video0 -r 10 -b:v 500k -f matroska - | mplayer - -idle -demuxer matroska
Run Code Online (Sandbox Code Playgroud)

在哪里

  • -an关闭音频编码。如果您想要音频,请替换-an为-f alsa -ac 1 -i hw:3(其中 hw:3 也可以是 hw:0 或 hw:1,...请参阅arecord -l您的设备)。如果您只想要音频(没有视频),请使用此)
  • -s 640x480 是您的视频在 x 和 y 维度上的大小
  • -r 10 是您想要接收的帧率(较低在低比特率下制作更好的图像,但看起来更笨拙)
  • -b:v 500k 是 500 KB/s 的比特率

您需要在远程主机上安装 ffmpeg 并在本地机器上安装 mplayer。

与ffmpeg和mpv

ssh USERNAME@REMOTEHOST ffmpeg -an -f video4linux2 -s 640x480 -i /dev/video0 -r 10 -b:v 500k -f matroska - | mpv --demuxer=mkv /dev/stdin
Run Code Online (Sandbox Code Playgroud)

与ffmpeg和ffplay

ssh USERNAME@REMOTEHOST ffmpeg -an -f video4linux2 -s 640x480 -i /dev/video0 -r 10 -b:v 500k -f matroska - | ffplay -f matroska /dev/stdin
Run Code Online (Sandbox Code Playgroud)


Mac*_*tka 16

就像是:

dd if=/dev/video0 | mplayer tv://device=/dev/stdin
Run Code Online (Sandbox Code Playgroud)

在本地为我工作(SOA#1)。也是如此:

ssh localhost dd if=/dev/video0 | mplayer tv://device=/dev/stdin
Run Code Online (Sandbox Code Playgroud)

也

mkfifo test
dd if=/dev/video0 of=test &
mplayer tv://device=test
Run Code Online (Sandbox Code Playgroud)

因此:

  1. 尝试不使用命名管道
  2. 检查带宽

此外-如何做不工作(显示黑屏,抱怨未知设备等)?

  • 这个答案非常具有误导性。`mplayer` 的“正确”调用应该是 `mplayer tv:// -tv device=/dev/stdin` 或类似的,但这不起作用(字符设备比 `dd` 可以正确处理更特殊)。当您运行 `mplayer tv://device=/dev/stdin` 时,它没有看到设备规范,因此直接返回到 `/dev/video0`,给人一种“工作”的错觉。但是当网络摄像头和`mplayer`进程被网络分开时,它根本不起作用。 (2认同)
  • 是的,这**看起来**工作正常,因为您通过 SSH 连接到本地主机,但实际上它失败了,mplayer 回退到本地主机上的 /dev/video0。如果您尝试使用这些命令通过 SSH 连接到另一台计算机(即不是本地主机),您将看到本地网络摄像头,而不是远程网络摄像头。 (2认同)

con*_*tti 5

接受的答案对我不起作用。dd根本不会读它。nc如果你不能腾出另一个端口就很糟糕了(无论如何我也根本没有让它工作)。cat也不适合我。

最终对我有用的是在接收端:

ssh user@host "ffmpeg  -r 14 -s 640x480 -f video4linux2 -i /dev/video0 -f matroska -" | mplayer - -idle
Run Code Online (Sandbox Code Playgroud)

这样做的好处是它被编码,因此您可以节省带宽。在 Debian 机器上,任何论坛/网站上的其他内容都无法为我工作。


与tee结合,可以边观看边录音:

ssh user@host "ffmpeg  -r 14 -s 640x480 -f video4linux2 -i /dev/video0 -f matroska -" | tee $(date +%Y-%m-%d_%H-%M-%S)_recording.mkv | mplayer - -idle
Run Code Online (Sandbox Code Playgroud)

这将打开 mplayer 进行实时流式传输,并将其同时保存到包含当前日期时间的文件中(示例文件名:2018-11-22_01-22-10_recording.mkv)。