Python程序Airnef在下载图像时卡住了。

9
我正在使用Airnef通过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的连接
相机型号“佳能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存储库: https://github.com/besi/airnef

代码卡住的地方在airnefcmd.py:3203

更新:论坛帖子

这是testcams.com上的论坛帖子链接

更新:调试

第一张名为IMG_0182的照片已成功下载

在调试输出中,我可以看到正在拍摄新照片,但跳过下载,因为之前的图片已经下载:

查看 airnef.log:433

    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:

现在我们又进入了循环,等待更多的图片。 当拍摄新图片时,同样的过程会再次发生。

另外,电脑和相机的时间是否同步? - CristiFati
1
显然,在尝试下载第二张图片时,它会看到第一张图片,然后忽略一切。不确定是一个错误,还是与您的相机有关系,您可以尝试调整某些参数: --downloadhistory ignore (可能会多次下载每个文件),或者 --rtd_mtppollingmethod_newobjdetection numobjs ,或者作为解决方法,找到一种方法在下载完成后从相机中删除文件。 - CristiFati
@CristiFati:numobjs参数与--transferorder oldestfirst结合使用就可以解决问题了。您可以添加一个答案,我会很乐意接受的。 - Besi
这就是幸运组合吗?两个参数中的任何一个单独使用都行不通?似乎有些“可疑” :)。 - CristiFati
实际上transferorder的默认值是oldestfirst。因此,尽管rtd_mtppollingmethod_newobjdetection标志确实可以解决问题,但一旦启用了newestfirst,它就不再起作用。这意味着这确实是一个幸运的组合。很可能这是一个bug,我在testcams论坛中指出了这一点。 - Besi
显示剩余7条评论
1个回答

2
我没有兼容的相机,所以我仅根据论坛上发布的“调试”模式日志来回答问题。
此外,这只是评论区中的一次试错建议,并非“科学”的方法(即识别原因,然后修复)。
需要团队(@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)时,存在第一个文件(IMG_0182.JPG)会触发所有操作被放弃。

浏览[TestCams]: airnef - 从尼康相机无线下载!时,其中一个命令行参数(实际上有更多我建议的)引起了我的注意:
--rtd_mtppollingmethod_newobjdetection,我建议指定numobjs(从而覆盖默认值)。显然,这是(主要的)问题。
另一部分是存在--transferorder newestfirst。在实时下载模式下,默认设置为oldestfirst(见下文)。删除它(或冗余地指定--transferorder oldestfirst)就解决了问题。

结论

为了解决问题,需要两件事情(就airnefcmd.pycmdlinearg而言):

  • 指定--rtd_mtppollingmethod_newobjdetection numobjs
  • 删除--transferorder newestfirst

根据[GitHub]: besi/airnef - (master) airnef/airnefcmd.py#3403

g.args['transferorder'] = 'oldestfirst'     # so that downloadMtpFileObjects() will properly enumerate through multiple realtime images as we add them

我认为这是airnef方面的错误(关于--transferorder)。它可能存在于以下位置之一:

  • 代码:--transferorder在实时模式下应该被忽略
  • 文档:--transferorder newestfirst不兼容实时模式,请指明

哇,非常感谢你的礼物!!!我还想提一下,我做这件事并不是为了积分 :)。 - CristiFati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接