Python 如何将录制的数据从ONVIF摄像机导出到我的计算机

Python 如何将录制的数据从ONVIF摄像机导出到我的计算机,python,onvif,zeep,python-onvif,Python,Onvif,Zeep,Python Onvif,我有一个符合ONVIF标准的摄像头(Amcrest IP8M-2496EW),它有一个板载SD卡用于本地存储。我正在尝试使用“*”中记录的“ExportRecordedData()”方法将录音(MP4和JPG)从相机下载到我的计算机。这是我能找到的唯一一个与从远程ONVIF设备下载或检索文件相关的功能 我已经成功地使用Python3和一个稍微修改过的基本文件与相机进行了通信。有了这个软件,我已经使用设备、录音和搜索服务测试了各种服务方法 在ONVIF中,录制不是一个文件(例如video.mp4)

我有一个符合ONVIF标准的摄像头(Amcrest IP8M-2496EW),它有一个板载SD卡用于本地存储。我正在尝试使用“*”中记录的“ExportRecordedData()”方法将录音(MP4和JPG)从相机下载到我的计算机。这是我能找到的唯一一个与从远程ONVIF设备下载或检索文件相关的功能

我已经成功地使用Python3和一个稍微修改过的基本文件与相机进行了通信。有了这个软件,我已经使用设备、录音和搜索服务测试了各种服务方法

在ONVIF中,录制不是一个文件(例如video.mp4),而是一个带有开始和停止事件的媒体时间线。我的理解是ExportRecordedData()函数将提取该媒体并创建一个文件,我应该能够在计算机上检索并查看该文件。目前我还不知道如何让它真正发挥作用。下面是我正在尝试的代码片段:

for segment in recording_list:
    startpoint = segment[0]
    endpoint = segment[1]
    sp = "%s" % startpoint
    ep = "%s" % endpoint
    print("StartPoint-EndPoint %s %s" % (startpoint, endpoint))
    # Example: 2020-07-10 02:04:15+00:0                                                                                                                                                                                           
    storage_root = "/home/pi/"
    storage_filename = sp[0:10] + " " + sp[11:13] + "." + sp[14:16] + "." + sp[17:19]
    fileformat = "mp4"
    full_path = storage_root + storage_filename + "." + fileformat
    print("Storing media to %s" % full_path)
    scope = recordings[0]
    storagereferencepath = {'RelativePath': storage_filename}                                                                                                                                                                     
    storage = {'StorageToken': storage_root, 'RelativePath': storage_filename}
    export = {'StartPoint': startpoint, 'EndPoint': endpoint, 'SearchScope': scope, 'FileFormat': fileformat, 'StorageDestination': storage}

    # Export this segment                                                                                                                                                                                                         
    print("ExportRecordedData() using recording_service")
    export_token = recording_service.ws_client.ExportRecordedData(**export)
我不确定其中的几个参数,因为规范是最小的,我还没有找到任何合适的例子。此调用的结果如下:

Traceback (most recent call last):
  File "./cam.py", line 322, in <module>
    main()
  File "./cam.py", line 273, in main
    export_token = recording_service.ws_client.ExportRecordedData(**export)
  File "/usr/local/lib/python3.7/dist-packages/zeep/proxy.py", line 45, in __call__
    kwargs,
  File "/usr/local/lib/python3.7/dist-packages/zeep/wsdl/bindings/soap.py", line 130, in send
    return self.process_reply(client, operation_obj, response)
  File "/usr/local/lib/python3.7/dist-packages/zeep/wsdl/bindings/soap.py", line 195, in process_reply
    return self.process_error(doc, operation)
  File "/usr/local/lib/python3.7/dist-packages/zeep/wsdl/bindings/soap.py", line 362, in process_error
    subcodes=subcodes,
zeep.exceptions.Fault: Unknown Error
回溯(最近一次呼叫最后一次):
文件“/cam.py”,第322行,在
main()
文件“/cam.py”,第273行,主
export\u token=recording\u service.ws\u client.ExportRecordedData(**导出)
文件“/usr/local/lib/python3.7/dist-packages/zeep/proxy.py”,第45行,在调用中__
夸尔斯,
文件“/usr/local/lib/python3.7/dist-packages/zeep/wsdl/bindings/soap.py”,第130行,在send中
返回自处理\应答(客户端、操作\对象、响应)
文件“/usr/local/lib/python3.7/dist-packages/zeep/wsdl/bindings/soap.py”,第195行,进程中
返回自处理错误(单据、操作)
文件“/usr/local/lib/python3.7/dist-packages/zeep/wsdl/bindings/soap.py”,第362行,进程中出错
子代码=子代码,
zeep.exceptions.Fault:未知错误
所以我现在陷入困境,对如何实现下载MP4的目标有几个问题

该摄像机是否支持ONVIF导出(所有录制都是通过Amcrest web界面开始的,而不是通过ONVIF录制作业)

相机不报告任何文件格式(“SupportedExportFileFormats”:无)。说明书上说在这种情况下相机不会输出任何东西。是这样吗?结束了

ExportRecordedData()是否仅表示录制时间线事件将导出到相机的SD卡,而不是本地计算机?我没有看到任何用于保存远程交付的MP4或JPG数据的WSDL参数。然而,从ONVIF的描述来看,文件传输应该是可能的。我认为这必须通过zeep交给我的SOAP响应来实现

我很感激任何关于我是否面临这个项目的死胡同或只是需要一个适当的设置的建议。如果可能的话,我想使用ONVIF,但是会考虑API的其他建议。有另一个解决方案在,但它的相机特定的,我想看看是否有ONVIF解决方案第一