所以,我想做的事情可能有点复杂,但我正在寻找自己的方法。
让我解释一下基本知识:
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
decodebin2
已被取代decodebin
ffmpegcolorspace
已被取代videoconvert
- 已添加过滤
tee
器以解决v4l2loopback驱动程序(参见:https://github.com/umlaeute/v4l2loopback/issues/83)
答案3
这个命令对我来说效果更好:
gphoto2 --stdout --capture-movie | ffmpeg -i - -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video1