跳转至

录像下载

实现录像的查找与下载流程

接口概览

接口名称 功能描述
NET_SDK_FindFile 查找录像文件
NET_SDK_FindNextFile 获取文件信(文件名、大小、开始和结束时间)
NET_SDK_FindClose 关闭查找文件
NET_SDK_GetFileByTimeExV2 时间下载
NET_SDK_StopGetFile 停止下载
Note

接口详细参数见接口定义部分

流程说明

---
title: 录像下载
---

flowchart TD
    A(设备SDK初始化<br><strong>NET_SDK_Init</strong>)
    B(用户注册设备<br><strong>NET_SDK_Login</strong>或<br><strong>NET_SDK_LoginEx</strong>)

    subgraph 查找录像文件
        direction LR
        S0(查找录像文件<br><strong>NET_SDK_FindFile</strong>)
        S1(逐个获取录像文件信息<br><strong>NET_SDK_FindNextFile</strong>)
        S2(停止录像查找<br><strong>NET_SDK_FindClose</strong>)
        S0 --> S1 --> S2
    end

    subgraph 录像文件下载
        direction LR
        S00(按时间回放<br><strong>NET_SDK_GetFileByTimeExV2</strong>)
        S01(停止录像回放<br><strong>NET_SDK_StopPlayBack</strong>)
        S00 --> S01
    end


    E(注销设备<br><strong>NET_SDK_Logout</strong>)
    F(释放SDK资源<br><strong>NET_SDK_Cleanup</strong>)

    A --> B --> 查找录像文件 --> 录像文件下载 --> E --> F

示例代码

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
#include <iostream>
#include <string>
#include "stdafx.h"
#include "DVR_NET_SDK.h"
#include <iomanip>
#include <sstream>
#include <ctime>

using namespace std;

/*
    Transform string time to CTime
*/
CTime parseStrTimeToCTime(string_view intime)
{
    tm tm = {};
    istringstream ss(intime.data());
    // Parse string time
    ss >> get_time(& tm, "%Y-%m-%d %H:%M:%S");
    // Transform tm to time_t
    time_t tt = mktime(& tm);
    // Transform time_t to CTime
    CTime ctime(tt);
    return ctime;
}

void DownloadRecord()
{
    // Initial
    NET_SDK_Init();
    // Device information
    const std::string device_ip = "10.80.1.177";
    const DWORD decice_port = 6036;
    const std::string username = "admin";
    const std::string password = "123456";
    // Login
    NET_SDK_DEVICEINFO device_info = { 0 };
    LONG userid = NET_SDK_Login(const_cast<char*>(device_ip.c_str()), decice_port, const_cast<char*>(username.c_str()), const_cast<char*>(password.c_str()), & device_info);

    if(userid > 0) {
        cout << "Login successfully: " << userid << endl;

    } else {
        cout << "Failed to login: " << userid << endl;
        return;
    }

    // Find record file
    LONG chnn = 0;
    CTime startTime = parseStrTimeToCTime("2023-05-09 00:00:00");
    CTime endTime = parseStrTimeToCTime("2023-05-09 23:59:59");
    DD_TIME start = { startTime.GetSecond(), startTime.GetMinute(), startTime.GetHour(), 3, startTime.GetDay(), startTime.GetMonth() - 1, startTime.GetYear() - 1900 };
    DD_TIME end = { endTime.GetSecond(), endTime.GetMinute(), endTime.GetHour(), 3, endTime.GetDay(), endTime.GetMonth() - 1, endTime.GetYear() - 1900 };
    LONG ffHandle = NET_SDK_FindFile(userid, chnn, & start, & end);

    if(ffHandle == -1) {
        DWORD err1 = NET_SDK_GetLastError();
        cout << "Failed to find record file! Error code: " << err1 << endl;

    } else {
        cout << "Find record file successfully!" << endl;
        // Get file information (filename, size, startTime and stopTime)
        NET_SDK_REC_FILE searchFile;
        LONG result = NET_SDK_FindNextFile(ffHandle, & searchFile);
        HWND hWnd = GetConsoleWindow();

        if(result != NET_SDK_FILE_SUCCESS) {
            DWORD err4 = NET_SDK_GetLastError();
            cout << "Failed to get file information! Error code: " << err4 << endl;

        } else {
            cout << "Get file information successfully!" << endl;
            NET_SDK_REC_FILE downloadFile;
            CString fname;
            CString savePath = "D:\\\\";
            SYSTEMTIME time = { 0 };
            ::GetLocalTime(& time);
            fname.Format("%sbackup_%d%02d%02d%02d%02d%02d.avi", savePath.GetBuffer(0), time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);
            LONG dlHandle = NET_SDK_GetFileByTimeExV2(userid, chnn, &searchFile.startTime, &searchFile.stopTime, fname.GetBuffer(), FALSE, 0, FALSE, NULL, 0);
            // Waiting for downloading
            Sleep(10000);

            if(dlHandle == -1) {
                DWORD err4 = NET_SDK_GetLastError();
                cout << "Failed to download! error code: " << err4 << endl;

            } else {
                cout << "Download successfully!" << endl;
            }
        }

        // Stop to Find record file
        NET_SDK_FindClose(ffHandle);
    }

    // Logout
    NET_SDK_Logout(userid);
    // Clean up the data
    NET_SDK_Cleanup();
}

相关说明

  • 下载路径须是已存在的有效路径,路径中有文件夹不存在时,下载失败,SDK 不会自动创建

  • 下载的录像过大时,下载等待时间可能需要增加

错误码