我可以通过 gphoto2 + v4l2loopback 将我的 DSLR 用作网络摄像头吗?

我可以通过 gphoto2 + v4l2loopback 将我的 DSLR 用作网络摄像头吗?

所以,我想做的事情可能有点复杂,但我正在寻找自己的方法。

让我解释一下基本知识:

1 - 我有一台数码单反相机,我想把它用作网络摄像头(但 v4l2 无法用它制作 /dev/videoX 设备,所以没有互联网应用程序可以使用它,只有特定的应用程序可以使用它,例如 Darktable)

2 - 我可以通过 gphoto2 从相机获取实时帧(但我不确定如何传输它们,以及是否需要缩放和编码/解码它们)

3 - 我可以使用 v4l2loopback 创建一个假的网络摄像头设备(如 /dev/video1),并且我可以使用 gst-launch 将数据传输到它(但我不确定如何将帧传输到它)

我所知道的是:

1-我可以像这样将相机中的帧发送到标准输出:

gphoto2 --capture-movie --stdout

2 - 我可以将数据从视频测试源发送到假网络摄像头设备,如下所示:

gst-launch-0.10 videotestsrc ! v4l2sink device=/dev/video1

3-gphoto2使用的格式是mjpg(JPEG格式)

那么,你能帮助我吗?

我如何将帧从 gphoto2 传输到 gst-launch,并将其与 v4l2sink 一起使用将它们发送到 /dev/video1(这样我就可以将它用作网络摄像头)?

谢谢!

答案1

结果相当简单:

modprobe v4l2loopback

然后执行此操作

gphoto2 --stdout --capture-movie | gst-launch-0.10 fdsrc ! decodebin2 name=dec ! queue ! ffmpegcolorspace ! v4l2sink device=/dev/video0

当然,您应该根据您的情况更改视频设备。

答案2

截至 2017 年 10 月,流处理器已更新至 1.0,并且v4l2loopback也收到了一些更新。

因此,@Reinaert Albrecht 发布的旧命令不再起作用,现在有效的新命令是

gphoto2 --stdout --capture-movie | gst-launch-1.0 fdsrc fd=0 ! decodebin name=dec ! queue ! videoconvert ! tee ! v4l2sink device=/dev/video0

答案3

这个命令对我来说效果更好:

gphoto2 --stdout --capture-movie | ffmpeg -i - -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video1

相关内容