使用数码相机(佳能)作为网络摄像头

我无法将我的数码相机(佳能ixus 160)用作网络摄像头,有没有适用的应用程序?还是只需要在设置中进行调整?

添加更多信息。你一定遇到了一些错误或其他问题。 - Rahul
在手册中有没有任何线索表明这是可能的?之前有类似的问题被问过,链接是http://askubuntu.com/questions/53889/use-old-usb-digital-camera-as-webcam,但它被关闭了(我认为没有充分的理由)。此外,在这个教程http://www.moreno.marzolla.name/software/linux-webcam-server/中也有类似的操作。 - Bruni
4个回答

这是另一个解决方案。
支持的相机列表:http://gphoto.org/proj/libgphoto2/support.php 您需要安装 gphoto、v4l2loopback-utils 和 ffmpeg。
然后,
sudo modprobe v4l2loopback

并且

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

现在你可以使用数码相机的网络摄像头了。

3我遇到了这个错误(截取顶部): 输入 #0,mjpeg,来自 'pipe:': 时长:N/A,比特率:N/A 流 #0:0:视频:mjpeg,yuvj422p(pc, bt470bg/unknown/unknown),1056x704,25 tbr,1200k tbn,25 tbc 流映射: 流 #0:0 -> #0:0 (mjpeg (native) -> rawvideo (native)) [swscaler @ 0x559c14f77de0] 使用了已弃用的像素格式,请确保您正确设置了范围 [v4l2 @ 0x559c14f42fc0] ioctl(VIDIOC_G_FMT):无效参数 无法为输出文件 #0 写入头部(编解码器参数不正确?):无效参数 初始化输出流 0:0 失败! 转换失败! ➜ ~ - noreabu
如果你有其他的网络摄像头,/dev/video1 可能不是回环设备。你可以使用 v4l2-ctl --list-devices 命令来检查设备类型。 - Hubert Kario
1它对我有效...但分辨率是1056x704。是否可以将其更改为16:9的分辨率,比如720p?我正在使用佳能T3i相机,Entangle上有这个选项...但我不知道如何修改您的命令以切换到不同的长宽比。 - Rafael

这是可以做到的,但需要一些步骤。首先,您必须安装gphotov4l2loopback-utilssudo apt-get install gphoto2 v4l2loopback-utils 通过USB连接相机(当相机自动挂载时,请卸载它)。然后运行gphoto2 --abilities来查看您的相机是否具备此功能。以下是连接佳能EOS 1200D时的输出结果。

enter image description here

然后运行sudo modprobe v4l2loopback来激活内核模块,从您的摄像头创建一个视频设备。
我看过一些旧教程使用gst-launch-0.10来完成此任务的下一步(例如this one)。我正在使用Ubuntu 17.04,它使用gst-launch-1.0。以下是更新后的命令,用于从您的数码相机创建一个视频设备: gphoto2 --stdout --capture-movie | gst-launch-1.0 fdsrc ! decodebin3 name=dec ! queue ! videoconvert ! v4l2sink device=/dev/video1 这将在/dev/video1中创建一个视频设备,您现在可以在诸如VLC之类的程序中使用它。
如果您看到有关设备正在使用的任何错误,请通过运行killall gvfs-gphoto2-volume-monitor来终止gvfs-gphoto2-volume-monitor进程。

6我得到这个: ➜ ~ gphoto2 --stdout --capture-movie | gst-launch-1.0 fdsrc!decodebin3 name = dec!queue!videoconvert!v4l2sink设备= / dev / video1 将管道设置为PAUSED ... 将缩略图作为电影记录在'stdout'中。按Ctrl-C取消。 错误:管道不想暂停。 错误:来自元素/GstPipeline:pipeline0 / GstV4l2Sink:v4l2sink0的 »/dev/video1« 不是播放设备。 附加的调试信息: v4l2_calls.c(642):gst_v4l2_open():/GstPipeline:pipeline0 / GstV4l2Sink:v4l2sink0: 功能:0x5200001 将管道设置为NULL ... 释放管道 ... - noreabu
@noreabu听起来像是一个你应该报告的错误。 - hellocatfood
1尝试使用/dev/video2 - Melroy van den Berg
这是通过上面的ffmpeg答案解决的。我不得不使用guvcview来查看输出结果。 - Jonathan
我收到了modprobe: FATAL: Module v4l2loopback not found in directory /lib/modules/4.15.0-36-generic的错误信息。 - virtualxtc
我确认这在Ubuntu 18.04上与佳能70D相机很好地运作。唯一的区别是设备不是通过sudo modprobe v4l2loopback命令在/dev/video1创建,而是在/dev/video0创建。无论如何,非常感谢您的回答! :) - edison23
小心,像佳能70D这样的旧相机在开启传感器时会有时间限制,因为它会产生相当多的热量。在我的佳能70D上,限制是30分钟,所以不适合进行较长时间的视频通话。 - edison23
我在Ubuntu 18.04上使用的是Panasonic HC-V777。当卸载相机并查询 gphoto2 --abilities时,我得到的回应是 *** Fehler (-105: »Unknown Model«) ***。我需要向gphoto开发人员报告我的相机不受支持吗?在 http://gphoto.org/proj/libgphoto2/support.php 中提到:如果它是基于USB大容量存储的相机(类似于USB存储设备或U盘),则由您的操作系统挂载,而不是由gphoto2挂载。在这种情况下,无需向我们报告。 而且我的相机确实被挂载为大容量存储设备。 - Torsten
我在这里发布了一个解决方案,用于卸载您的相机。如果通过Nautilus无法卸载,请参考以下链接:https://askubuntu.com/questions/1265670/ - Torsten

我能够使用佳能DSLR 600D进行视频和图像录制。
sudo apt get install guvcview ffmpeg gphoto2 v4l2loopback-dkms v4l2loopback-utils ffmpeg
插入相机,任何模式似乎都可以工作,用基本功能进行测试:
准备工作
sudo modprobe v4l2loopback
killall gvfs-gphoto2-volume-monitor

测试
lsusb
gphoto2 --auto-detect
LANG=C gphoto2 --summary
LANG=C gphoto2 --list-all-config

尝试

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

在另一个终端中可视化。
guvcview
或者

guvcview-brlin.guvcview

你可以尝试不同的/dev/video1命令。
还有EOS Movie Recorder
解压这个:https://sourceforge.net/projects/eos-movrec/files/eos-movrec/0.3.3_beta/eos-movrec-0.3.3_beta.zip/download
cd eos-movrec-0.3.2_beta
sudo apt install libgphoto2-dev                                     
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make

3非常感谢。我会使用这个命令,并在OBS中捕获窗口:"gphoto2 --stdout --capture-movie | ffplay - "。 - y o
非常感谢您的提问。是的,可以同时访问相机和麦克风,并将其作为可访问设备使用。 - azmeuk
OBS具有麦克风功能,并且还可以使用插件将整个设置暴露为网络摄像头。 - Jonathan

我发现这对我非常有用,它确实可以与我的佳能5D Mark 3相机配合使用。
如何将您的单反相机用作网络摄像头
OBS是一个非常好的工具,可用于直播和录制演示或培训。它还可以用作虚拟摄像头,作为Jitsi、Skype和Zoom等工具的输入。我们中的许多人都有很好的单反相机,这些相机可以作为OBS(以及任何其他可以使用摄像头源的工具)的摄像头输入。这使您可以使用高质量的相机进行视频输入,并提供数字相机所具有的完全控制权。在这个视频中,我向您展示了如何使用几乎任何相机作为OBS的摄像头,而无需任何特殊软件或硬件适配器。您只需要一台相机和一根USB电缆。这是通过gphoto2、ffmpeg和v42loopback的组合实现的。
确保您的相机品牌和型号得到支持。您可以在http://gphoto.org/proj/libgphoto2/support.php找到此方法支持的相机列表。幸运的是,我的佳能相机都得到了支持。您需要一台支持的相机和一根USB电缆将相机连接到计算机。
设置相机以使其不会自动关闭。在我的佳能6D Mark ii上,这是在扳手屏幕2上的“自动关闭:禁用”。
如果您启用了后置对焦按钮,您需要将对焦设置回半按快门键。如果您使用后置对焦按钮,您已经知道如何做到这一点。如果您保留后置对焦按钮,您将收到与快门按钮半按相关的错误。
如果您尚未安装gphoto2,请先安装它。 sudo apt install -y gphoto2
如果您尚未安装视频回环驱动程序,请先安装它。 sudo apt install -y v4l2loopback-utils
如果您尚未安装ffmpeg,请先安装它。 sudo apt install -y ffmpeg
通过USB连接您的相机(如果相机自动挂载,请卸载它),选择它并右键单击文件管理器中的相机,然后从弹出菜单中选择“卸载”。
启用并确定虚拟视频设备 首先卸载v4l2loopback,以便您可以确定它正在创建的设备。 sudo rmmod v4l2loopback 忽略任何错误。
列出所有视频设备,以便您知道下一个是哪个 ls /dev/video* 您将看到类似于 /dev/video0 /dev/video1 这表示我的计算机上已经存在的视频设备。如果您在此处看不到任何内容,则表示您没有视频设备。
激活v4l2loopback 运行 sudo modprobe v4l2loopback exclusive_caps=1 max_buffers=2
激活内核模块('回环驱动程序'),从您的DSLR相机创建视频设备。
11. 列出所有视频设备,这样你就知道要使用哪一个了 ls /dev/video* 你会看到类似于 /dev/video0 /dev/video1 /dev/video2 最后一个将是由回环驱动程序使用的设备,在本例中是video2。
12. 测试 现在你可以使用gphoto 2进行一些测试。 列出自动检测到的相机以及它们连接的端口。
gphoto2 --auto-detect
你会看到类似于:
Model                          Port                                            
----------------------------------------------------------
Canon EOS 6d Mark II           usb:001,013 

13. 捕获视频并将其传输到虚拟摄像头设备
gphoto2 --stdout --capture-movie | ffmpeg -i - -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video2

14. 就是这样。现在你可以去将它添加到OBS中的源中了。
所有的简单,都是免费的,这要归功于自由开源软件。

和之前的评论一样。是否可以同时访问相机的麦克风(并将其作为可访问设备)? - azmeuk
非常感谢这个超棒的教程。在我的EOS 6D上完美运行。我该如何让自动对焦工作? - tcapelle
谢谢,使用参数max_buffers和exclusive_caps激活了v4l2loopback密钥。 - Peter1982