Python 中的 gphoto2 vs 命令行;无法在 Python 中捕捉预览

gphoto2 in Python vs command line; not able to capture preview in Python

我之前使用过 gphoto2(2.5.20,在 RPi 上),并且能够从命令行完成基础操作:

/usr/bin/gphoto2 --capture-image-and-download --filename=zzz.jpg --force-overwrite

/usr/bin/gphoto2 --capture-preview --filename=zzz.jpg --force-overwrite

后者捕获预览图像,它小得多,对于某些应用程序来说非常好;您基本上可以用 DSLR 制作网络摄像头。

但是,在为 python 安装 gphoto2 库后,这个(应该是等效的)失败了:

import gphoto2 as gp
camera = gp.Camera()
camera.init()
file_path = camera.capture(gp.GP_OPERATION_CAPTURE_PREVIEW)

与消息 "gphoto2.GPhoto2Error: [-6] Unsupported operation"

如果你选择

file_path = camera.capture(gp.GP_CAPTURE_IMAGE)

但是,这有效。我们可能从命令行而不是 Python 版本中获得工作预览的任何原因?

gp.__version__ returns 2.2.2 ,并匹配 https://github.com/jim-easterbrook/python-gphoto2

的最新版本

查看 gphoto2 程序源。您也许能够找出 --capture-preview 命令调用的 libgphoto2 函数序列。然后您应该能够在 Python.

中重现它

我深入研究了 libgphoto2 源代码。我拥有的相机属于 PTP 世界;我相信这是在 camlibs/ptp2/library.c 中,camera_capture_preview 函数所在的位置。 Python 代码在 Nikon 和 Sony 上均失败。代码中似乎确实有两件事指向可能的问题;在尼康部分,它将尝试20次以获取预览;在索尼部分,有关于时间的评论。但是,命令行有效,所以问题可能不存在。

我也查看了 Python 中的 gphoto2 实现。好消息是 https://github.com/jim-easterbrook/python-gphoto2/blob/master/examples/preview-image.py 处的代码有效,因此如果有人想在 Python 中执行此操作,他们可以替换

file_path = camera.capture(gp.GP_OPERATION_CAPTURE_PREVIEW) 行

那里有代码。

请注意,这适用于带有 gphoto2 (2.5.20) 的 rPi;在 Ubuntu 16.04 LTS 系统上,这会失败(gphoto2 是 2.5.9)。