问题描述
我正在使用通过 python 从我的佳能数码单反相机下载图片。
我可以毫无问题地下载一张图片,因此整个设置似乎都可以正常工作。 但是,只要我想下载另一个图像,软件就会挂起。 对我来说,代码看起来很复杂。
两个月前,我确实在 TestCams.com 上发布。 由于我没有得到回复,我将其作为与 python 相关的问题发布在这里。
线程
我从命令行启动 airnef。
python airnefcmd.py --ipaddress 192.168.188.84 --action getfiles --realtimedownload only --downloadexec open @pf@ --transferorder newestfirst --outputdir "/Users/besi/Desktop"
我连接了相机,并显示了有关我的连接的一些信息:
建立到 192.168.188.84:15740 的连接
相机型号“Canon EOS 200D”,序列号“XXXXXXXXX”
现在airnef告诉我:
等待来自相机的实时照片下载。
按退出 |
我拍了一张照片,它按预期下载了它:
下载“IMG_0084.JPG”:96%
Airnef 然后显示了有关此图像的更多信息:
/Users/besi/Desktop/IMG_0084.JPG [大小 = 4,602,357] 1.94 秒 (2.26 MB/s)
我又拍了一些照片,但没有下载,软件卡在提示处:
等待来自相机的实时照片下载。 按退出\\
源代码
源代码可在 Airnef 网站上找到。 我创建了一个 github 存储库来解决这个问题: :
代码卡住的地方在
更新:论坛帖子
这是的链接
更新:调试
第一个名为 IMG_0182 的图像成功。
在调试输出中,我可以看到正在拍摄一张新照片,但下载被跳过,因为之前的图像已经下载:
参见 :
filename = DCIM\100CANON\IMG_0183.JPG
captureDateSt = 20180926T071759
modificationDateStr= 20180926T071758
发现了一个名为IMG_0183.JPG
的新图像。
Skipping IMG_0182.JPG - already downloaded this session
旧的下载图像似乎阻止了对当前图像的进一步处理。
Skipping 100CANON - object is not file - MTP_OBJFORMAT_Assocation (0x3001)
Skipping DCIM - object is not file - MTP_OBJFORMAT_Assocation (0x3001)
Waiting for realtime photos from camera to download. Press <ctrl-c> to exit -execMtpOp: MTP_OP_GetObjectHandles - CmdReq payload:
现在我们再次在循环中等待更多图片。 当拍摄一张新照片时,同样的过程会再次发生。
1楼
我没有兼容的相机,所以我的回答仅基于论坛上发布的日志(在调试模式下)。
这也是其中一条评论中的反复试验建议,因此它不是“科学”方法(确定原因,然后修复)。
需要一个团队(@Besi 和我)的努力才能提出这个答案(并且应该相应地分配功劳)。
根据日志,这两个文件的处理方式有所不同:
... filename = DCIM\\100CANON\\IMG_0182.JPG captureDateSt = 20180926T071747 modificationDateStr= 20180926T071748 Download history file “/Users/besi/Library/Application Support/airnef/appdata/Canon EOS 200D-SN59074c1578e347a3bf1f6f85e8dec624-downloadhist” loaded – 53 entries >> MTP_OP_GetObject Downloading “IMG_0182.JPG”: 0%IMG_0182.JPG – downloading next piece, offset=0x0, count=0x100000 ... filename = DCIM\\100CANON\\IMG_0183.JPG captureDateSt = 20180926T071759 modificationDateStr= 20180926T071758 Skipping IMG_0182.JPG – already downloaded this session Skipping 100CANON – object is not file – MTP_OBJFORMAT_Assocation (0x3001) Skipping DCIM – object is not file – MTP_OBJFORMAT_Assocation (0x3001) Waiting for realtime photos from camera to download. Press <ctrl-c> to exit -execMtpOp: MTP_OP_GetObjectHandles – CmdReq payload: ...
作为处理第二文件(IMG_0183.JPG),第1一(IMG_0182.JPG)的存在时看到的,被抛弃的触发器的一切。
浏览
,其中一个命令行参数(实际上,我建议的还有更多)引起了我的注意:
--rtd_mtppollingmethod_newobjdetection ,我建议指定numobjs (因此,覆盖默认值)。
显然,这是(主要)问题。
另一部分是--transferorder newestfirst的存在。
默认情况下,在实时下载模式下,它设置为最旧优先(见下文)。
删除它(或多余地指定--transferorder oldfirst )可以解决问题。
结论
为了解决这个问题,有两件事是必要的(就airnefcmd.py的cmdline arg s而言):
- 指定--rtd_mtppollingmethod_newobjdetection numobjs
- 删除--transferorder newestfirst
根据 :
g.args['transferorder'] = 'oldestfirst' # so that downloadMtpFileObjects() will properly enumerate through multiple realtime images as we add them
我认为这是airnef方面的一个错误(关于--transferorder )。 它位于任一
- 代码:-- transferorder在实时模式下应该被忽略
- 文档:指定--transferorder newestfirst与实时模式不兼容