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
相机型号“Canon EOS 200D”,序列号“XXXXXXXXX”的连接</p>

现在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:

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

4

1 回答 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 latestfirst的存在。默认情况下,在实时下载模式下,它设置为最旧优先(见下文)。删除它(或冗余指定--transferorder oldfirst)就可以了。

结论

为了解决这个问题,需要做两件事(就 airnefcmd.py 的cmdline arg而言

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

根据[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
  • Doc : 指定--transferorder latestfirst与实时模式不兼容
于 2018-10-02T08:31:16.667 回答