国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

大華攝像頭windows、linuxJavaSDK開(kāi)發(fā)使用

這篇具有很好參考價(jià)值的文章主要介紹了大華攝像頭windows、linuxJavaSDK開(kāi)發(fā)使用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

簡(jiǎn)介

本文檔主要介紹 SDK 接口參考信息,包括主要功能、接口函數(shù)和回調(diào)函數(shù)。
主要功能包括:SDK 初始化、設(shè)備登錄、實(shí)時(shí)預(yù)覽、云臺(tái)控制、語(yǔ)音對(duì)講、報(bào)警監(jiān)聽(tīng)、智能訂閱、
錄像回放和錄像下載等。
根據(jù)環(huán)境不同,開(kāi)發(fā)包包含的文件會(huì)不同,具體如下所示。
Windows 開(kāi)發(fā)包所包含的文件如下:
大華攝像頭開(kāi)發(fā)文檔,Sdk,java
Linux 開(kāi)發(fā)包所包含的文件如下:
大華攝像頭開(kāi)發(fā)文檔,Sdk,java
SDK 的功能庫(kù)和配置庫(kù)是必備庫(kù)。
功能庫(kù)是設(shè)備網(wǎng)絡(luò) SDK 的主體,主要用于網(wǎng)絡(luò)客戶(hù)端與各類(lèi)產(chǎn)品之間的通訊交互,負(fù)責(zé)遠(yuǎn)程
控制、查詢(xún)、配置及碼流數(shù)據(jù)的獲取和處理等。
配置庫(kù)針對(duì)配置功能的結(jié)構(gòu)體進(jìn)行打包和解析。
推薦使用播放庫(kù)進(jìn)行碼流解析和播放。

環(huán)境要求

1、推薦內(nèi)存:不低于 512 MB。
2、Jdk 使用版本:jdk1.6;jdk1.8
3、SDK 支持的系統(tǒng):

  • Windows 10/Windows 8.1/Windows 7/vista/XP/2000 以及 Windows Server 2008/2003。
  • Linux Red Hat/SUSE 等通用 Linux 系統(tǒng)

庫(kù)加載問(wèn)題及解決方法

目前提供 Windows(.dll)、Linux(.so)兩種平臺(tái)的動(dòng)態(tài)庫(kù)。其中 win 和 linux 分為 64 位、32 位版本。
而調(diào)用 C++動(dòng)態(tài)庫(kù)的主要的方式分為“直接使用 Java 項(xiàng)目”和“將 Java 項(xiàng)目作為其他項(xiàng)目的 jar
包依賴(lài)運(yùn)行”兩種。在加載庫(kù)的過(guò)程中會(huì)出現(xiàn)“找不到動(dòng)態(tài)庫(kù)”的相關(guān)錯(cuò)誤。
“找不到動(dòng)態(tài)庫(kù)”問(wèn)題的根本原因?yàn)榇a路徑和物理路徑不匹配。因?yàn)?linux 版本的動(dòng)態(tài)庫(kù)名稱(chēng)
相較于 Windows 版本多出 lib 前綴,故 Linux 環(huán)境下加載動(dòng)態(tài)庫(kù)需要注意 lib 的前綴,在拼接動(dòng)態(tài)
庫(kù)路徑時(shí)需要加上 lib 前綴。使用 java.io.tmpdir 方式實(shí)現(xiàn)路徑映射時(shí),需要注意此種方式優(yōu)先級(jí)
較低。

大華攝像頭Java SDK,完成攝像頭設(shè)備登錄、視頻錄像

下載大華攝像頭Java sdk

下載好項(xiàng)目部署所在服務(wù)器類(lèi)型的sdk,如果windows 與linux 都要部署或使用可以將兩個(gè)版本的sdk都下載下來(lái),然后共用一套java代碼,只需要判斷當(dāng)前系統(tǒng)類(lèi)型然后加載不同的libs就好了。

目錄結(jié)構(gòu)

大華攝像頭開(kāi)發(fā)文檔,Sdk,java

doc是sdk的文檔存放路徑
libs是c++依賴(lài)庫(kù)
res是國(guó)際化相關(guān)配置

大華攝像頭開(kāi)發(fā)文檔,Sdk,java

windows 的c++代碼

大華攝像頭開(kāi)發(fā)文檔,Sdk,java

Linux的C++代碼

大華攝像頭開(kāi)發(fā)文檔,Sdk,java

項(xiàng)目結(jié)構(gòu)

Common包與lib包為大華sdk封裝的代碼,直接copy過(guò)來(lái)就好
大華攝像頭開(kāi)發(fā)文檔,Sdk,java

libs包下有一個(gè)jnajar包,這個(gè)jar包可以通過(guò)maven命令打入本地廠(chǎng)庫(kù)或者直接引入

按照demo的封裝,進(jìn)行自己的封裝,以下是api包下的代碼

登錄

代碼是否可用可直接運(yùn)行main方法

import com.netsdk.common.Res;
import com.netsdk.lib.NetSDKLib;
import com.netsdk.lib.ToolKits;
import com.sun.jna.Pointer;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Vector;

/**
 * 設(shè)備登錄
 */
@Slf4j
@Data
public class DeviceLoginControl {
    public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
    public NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE;
    public NetSDKLib.LLong m_hPlayHandleOne = new NetSDKLib.LLong(0);
    private Vector<String> chnlist = new Vector<String>();
    public NetSDKLib.LLong m_hPlayHandleTwo = new NetSDKLib.LLong(0);
    // 設(shè)備信息
    public NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
    private NetSDKLib.LLong lRealHandle;
    private String videoStoragePath;

    private Long cycleTime;
    private Long cleanCycle;
    // 登陸句柄
    public NetSDKLib.LLong m_hLoginHandle = new NetSDKLib.LLong(0);

    private static boolean bInit = false;
    private static boolean bLogopen = false;

    public DeviceLoginControl() {
    }

    public DeviceLoginControl(NetSDKLib.fDisConnect disConnect, NetSDKLib.fHaveReConnect fHaveReConnect) {
        init(disConnect, fHaveReConnect);
    }

    public boolean init(NetSDKLib.fDisConnect disConnect, NetSDKLib.fHaveReConnect haveReConnect) {
        bInit = netsdk.CLIENT_Init(disConnect, null);
        if (!bInit) {
            log.info("Initialize SDK failed");
            return false;
        }
        //打開(kāi)日志,可選
        NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();
        File path = new File("./sdklog/");
        if (!path.exists()) {
            path.mkdir();
        }
        String logPath = path.getAbsoluteFile().getParent() + "\\sdklog\\" + ToolKits.getDate() + ".log";
        setLog.nPrintStrategy = 0;
        setLog.bSetFilePath = 1;
        System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);
        System.out.println(logPath);
        setLog.bSetPrintStrategy = 1;
        bLogopen = netsdk.CLIENT_LogOpen(setLog);
        if (!bLogopen) {
            log.error("Failed to open NetSDK log");
        }

        // 設(shè)置斷線(xiàn)重連回調(diào)接口,設(shè)置過(guò)斷線(xiàn)重連成功回調(diào)函數(shù)后,當(dāng)設(shè)備出現(xiàn)斷線(xiàn)情況,SDK內(nèi)部會(huì)自動(dòng)進(jìn)行重連操作
        // 此操作為可選操作,但建議用戶(hù)進(jìn)行設(shè)置
        netsdk.CLIENT_SetAutoReconnect(haveReConnect, null);

        //設(shè)置登錄超時(shí)時(shí)間和嘗試次數(shù),可選
        int waitTime = 5000; //登錄請(qǐng)求響應(yīng)超時(shí)時(shí)間設(shè)置為5S
        int tryTimes = 1;    //登錄時(shí)嘗試建立鏈接1次
        netsdk.CLIENT_SetConnectTime(waitTime, tryTimes);


        // 設(shè)置更多網(wǎng)絡(luò)參數(shù),NET_PARAM的nWaittime,nConnectTryNum成員與CLIENT_SetConnectTime
        // 接口設(shè)置的登錄設(shè)備超時(shí)時(shí)間和嘗試次數(shù)意義相同,可選
        NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM();
        netParam.nConnectTime = 10000;      // 登錄時(shí)嘗試建立鏈接的超時(shí)時(shí)間
        netParam.nGetConnInfoTime = 3000;   // 設(shè)置子連接的超時(shí)時(shí)間
        netParam.nGetDevInfoTime = 3000;//獲取設(shè)備信息超時(shí)時(shí)間,為0默認(rèn)1000ms
        netsdk.CLIENT_SetNetworkParam(netParam);

        return true;
    }
 	public static void main(String[] args) throws IOException {
        DeviceLoginControl deviceLoginControl = new DeviceLoginControl();
        deviceLoginControl.login("ip", 37777, "username", "password");
    }


    public boolean login(String m_strIp, int m_nPort, String m_strUser, String m_strPassword) {
        //IntByReference nError = new IntByReference(0);
        //入?yún)?        NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstInParam = new NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY();
        pstInParam.nPort = m_nPort;
        pstInParam.szIP = m_strIp.getBytes();
        pstInParam.szPassword = m_strPassword.getBytes();
        pstInParam.szUserName = m_strUser.getBytes();
        //出參
        NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam = new NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY();
        pstOutParam.stuDeviceInfo = m_stDeviceInfo;
        //m_hLoginHandle = netsdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword, 0, null, m_stDeviceInfo, nError);
        m_hLoginHandle = netsdk.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam);
        if (m_hLoginHandle.longValue() == 0) {
            System.err.printf("Login Device[%s] Port[%d]Failed. %s\n", m_strIp, m_nPort, ToolKits.getErrorCodePrint());
        } else {
            System.out.println("Login Success [ " + m_strIp + " ]");
        }

        return m_hLoginHandle.longValue() == 0 ? false : true;
    }

   
    public void realPlayByDataType() {

        // 創(chuàng)建Stin對(duì)象 設(shè)置碼流格式 通道號(hào)  預(yù)覽類(lèi)型 用戶(hù)數(shù)據(jù) 保存文件名稱(chēng)
        NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE();

        stIn.emDataType = NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS;
        stIn.nChannelID = 0;
        stIn.rType = NetSDKLib.NET_RealPlayType.NET_RType_Realplay;

        stIn.dwUser = null;
        stIn.szSaveFileName = "D:\\DahuaResult\\result.flv";   // 轉(zhuǎn)換后的裸H264碼流文件名

        // 創(chuàng)建Stout對(duì)象
        NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE();

        // 預(yù)覽轉(zhuǎn)碼流保存
        NetSDKLib.LLong lRealHandle = netsdk.CLIENT_RealPlayByDataType(m_hLoginHandle, stIn, stOut, 5000);
        if (lRealHandle.longValue() != 0) {
            System.out.println("RealPlayByDataType Succeed!");
        } else {
            System.err.printf("RealPlayByDataType Failed!Last Error[0x%x]\n", netsdk.CLIENT_GetLastError());
            return;
        }
        try {
            // 錄像時(shí)間 單位毫秒
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 停止預(yù)覽
        netsdk.CLIENT_StopRealPlay(lRealHandle);   // 必須停止拉流后,才會(huì)生成文件


    }
    public boolean logout() {
        netsdk.CLIENT_StopRealPlayEx(this.m_hPlayHandleOne);
        netsdk.CLIENT_StopRealPlayEx(this.m_hPlayHandleTwo);
        if (m_hLoginHandle.longValue() == 0) {
            return false;
        }
        boolean bRet = netsdk.CLIENT_Logout(m_hLoginHandle);
        if (bRet) {
            m_hLoginHandle.setValue(0);
        }
        for (int i = 0; i < m_stDeviceInfo.byChanNum; i++) {
            chnlist.clear();
        }
        return true;
    }
}

云臺(tái)控制

import com.netsdk.lib.NetSDKLib;

public class PtzControl {
    public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;

    public static boolean ptzControlStart(NetSDKLib.LLong m_hLoginHandle, Integer NET_PTZ_ControlType) {
        return netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NET_PTZ_ControlType, 2, 4, 0, 0);
    }

    public static boolean ptzControlEnd(NetSDKLib.LLong m_hLoginHandle, Integer NET_PTZ_ControlType) {
        return netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NET_PTZ_ControlType, 0, 0, 0, 1);
    }

    /**
     * 向上
     */
    public static boolean ptzControlUpEnd(NetSDKLib.LLong m_hLoginHandle) {
        return netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL, 0, 0, 0, 1);
    }

    /**
     * 向下
     */

    public static boolean ptzControlDownEnd(NetSDKLib.LLong m_hLoginHandle) {
        return netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL, 0, 0, 0, 1);
    }

    /**
     * 向左
     */

    public static boolean ptzControlLeftEnd(NetSDKLib.LLong m_hLoginHandle) {
        return netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL, 0, 0, 0, 1);
    }

    /**
     * 向右
     */

    public static boolean ptzControlRightEnd(NetSDKLib.LLong m_hLoginHandle) {
        return netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL, 0, 0, 0, 1);
    }

    public static boolean ptzControl(NetSDKLib.LLong m_hLoginHandle, Integer NET_PTZ_ControlType) {
        boolean b = netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, 0, NET_PTZ_ControlType, 0, 0, 0, 1);
        return b;
    }
}

錄像

import com.netsdk.lib.NetSDKLib;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Slf4j
public class VideoControl {
    public static void startRealPlay() throws FileNotFoundException {
        DeviceLoginControl deviceLoginControl = new DeviceLoginControl();
        deviceLoginControl.login("192.168.0.108", 37777, "admin", "admin123");
        NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE();
        stIn.emDataType = NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS;
        stIn.nChannelID = 0;
        stIn.rType = NetSDKLib.NET_RealPlayType.NET_RType_Realplay;
        File xfile = new File("a.dav");
        FileOutputStream fos = new FileOutputStream(xfile);
        stIn.cbRealData = new NetSDKLib.fRealDataCallBackEx() {
            @Override
            public void invoke(NetSDKLib.LLong lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, int param, Pointer dwUser) {
                // 指定回調(diào)流為PS格式
                if (dwDataType == 1001) {
                    byte[] byteArray = pBuffer.getByteArray(0, dwBufSize);
                    try {
                        fos.write(byteArray);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        };
        stIn.dwUser = null;
        stIn.szSaveFileName = "D:\\result.flv";   // 轉(zhuǎn)換后的裸H264碼流文件名
        // 創(chuàng)建Stout對(duì)象
        NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE();
        // 預(yù)覽轉(zhuǎn)碼流保存
        NetSDKLib.LLong lRealHandle = deviceLoginControl.netsdk.CLIENT_RealPlayByDataType(deviceLoginControl.m_hLoginHandle, stIn, stOut, 5000);
        if (lRealHandle.longValue() != 0) {
            System.out.println("RealPlayByDataType Succeed!");
        } else {
            System.err.printf("RealPlayByDataType Failed!Last Error[0x%x]\n", deviceLoginControl.netsdk.CLIENT_GetLastError());
        }
    }

    public static void videoRecording(DeviceLoginControl deviceLoginControl) {
        NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE();
        stIn.emDataType = NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS;
        stIn.nChannelID = 0;
        stIn.rType = NetSDKLib.NET_RealPlayType.NET_RType_Realplay;
        stIn.dwUser = null;
        log.info("設(shè)備登錄信息:{}", deviceLoginControl);
        stIn.szSaveFileName = deviceLoginControl.getVideoStoragePath() + new SimpleDateFormat("YYYYMMddHHmmssSSS").format(new Date()) + ".flv";   // 轉(zhuǎn)換后的裸H264碼流文件名
        // 創(chuàng)建Stout對(duì)象
        NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE();
        // 預(yù)覽轉(zhuǎn)碼流保存
        NetSDKLib.LLong lRealHandle = deviceLoginControl.netsdk.CLIENT_RealPlayByDataType(deviceLoginControl.m_hLoginHandle, stIn, stOut, 5000);
        if (lRealHandle.longValue() != 0) {
//            System.out.println(Res.string().getAttach());
            System.out.println("RealPlayByDataType Succeed!");
        } else {
            throw new RuntimeException("錄像失敗.{}");
        }
        try {
            // 錄像時(shí)間 單位毫秒
            Thread.sleep(deviceLoginControl.getCycleTime());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 停止預(yù)覽
        deviceLoginControl.netsdk.CLIENT_StopRealPlay(lRealHandle);   // 必須停止拉流后,才會(huì)生成文件
    }

    public static void videoRecording(Long cycleTime, String savePath, DeviceLoginControl deviceLoginControl) {
        NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE();
        stIn.emDataType = NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS;
        stIn.nChannelID = 0;
        stIn.rType = NetSDKLib.NET_RealPlayType.NET_RType_Realplay;
        stIn.dwUser = null;
        stIn.szSaveFileName = savePath + new SimpleDateFormat("YYYYMMddHHmmssSSS").format(new Date()) + ".flv";   // 轉(zhuǎn)換后的裸H264碼流文件名
        // 創(chuàng)建Stout對(duì)象
        NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE();
        // 預(yù)覽轉(zhuǎn)碼流保存
        NetSDKLib.LLong lRealHandle = deviceLoginControl.netsdk.CLIENT_RealPlayByDataType(deviceLoginControl.m_hLoginHandle, stIn, stOut, 5000);
        if (lRealHandle.longValue() != 0) {
            System.out.println("RealPlayByDataType Succeed!");
        } else {
            throw new RuntimeException("錄像失敗.{}");
        }
        try {
            // 錄像時(shí)間 單位毫秒
            Thread.sleep(cycleTime);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 停止預(yù)覽
        deviceLoginControl.netsdk.CLIENT_StopRealPlay(lRealHandle);   // 必須停止拉流后,才會(huì)生成文件
    }

    public static void main(String[] args) throws FileNotFoundException {
        DeviceLoginControl deviceLoginControl = new DeviceLoginControl();
        deviceLoginControl.login("ip", 37777, "username", "password");
        videoRecording(300000l, "", deviceLoginControl);
    }
}

DeviceContext

import com.netsdk.api.DeviceLoginControl;
import com.netsdk.common.Res;
import com.netsdk.common.SavePath;
import com.netsdk.lib.NetSDKLib;
import com.sun.jna.Pointer;
import com.web.device.manage.entity.CameraDeviceEntity;
import com.web.device.manage.service.CameraDeviceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

@Slf4j
@Component
public class DeviceContext {
    @Resource
    private CameraDeviceService cameraDeviceService;

    private Map<String, DeviceLoginControl> deviceLogin = new ConcurrentHashMap<>();

    /**
     * 初始化登錄與重連
     */
    @PostConstruct
    private void init() {
        List<CameraDeviceEntity> list = cameraDeviceService.list();
        Map<String, List<CameraDeviceEntity>> collect = list.stream().collect(Collectors.groupingBy(CameraDeviceEntity::getIp));
        for (CameraDeviceEntity cameraDevice : list) {
            DeviceLoginControl deviceLoginControl = new DeviceLoginControl(new DisConnect(), new HaveReConnect());
            if (loginRetry(cameraDevice, deviceLoginControl)) {
                deviceLoginControl.setCycleTime(cameraDevice.getCycleTime());
                deviceLoginControl.setVideoStoragePath(cameraDevice.getVideoStoragePath());
                deviceLoginControl.setCleanCycle(cameraDevice.getCleanCycle());
                deviceLogin.put(cameraDevice.getIp(), deviceLoginControl);
            }
        }
    }

    private boolean loginRetry(CameraDeviceEntity cameraDevice, DeviceLoginControl deviceLoginControl) {
        boolean login = deviceLoginControl.login(cameraDevice.getIp(), cameraDevice.getTcpPort(), cameraDevice.getLoginName(), cameraDevice.getPassword());
        if (!login) {
            log.error("{},正在嘗試重連", cameraDevice.getIp());
            int count = 0;
            while (!deviceLoginControl.login(cameraDevice.getIp(), cameraDevice.getTcpPort(), cameraDevice.getLoginName(), cameraDevice.getPassword())) {
                count++;
                log.error("重連 第{}次,請(qǐng)檢查網(wǎng)絡(luò)或設(shè)備是否在線(xiàn).{}", count, cameraDevice.getIp());
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    log.error("重連等待異常.{}", cameraDevice.getIp());
                    e.printStackTrace();
                }
                if (count >= 5) {
                    log.error("長(zhǎng)時(shí)間重連失敗,取消重連,請(qǐng)檢查網(wǎng)絡(luò)或設(shè)備是否在線(xiàn).{}", cameraDevice.getIp());
                    return false;
                }
            }
            log.info("重連成功.{}", cameraDevice.getIp());
        }
        return true;
    }

    @Scheduled(fixedDelay = 300000)
    public void initDevice() {
        List<CameraDeviceEntity> list = cameraDeviceService.list();
        list.forEach(f -> {
            if (!deviceLogin.containsKey(f.getIp()) && !deviceLogin.containsKey("DisConnect-" + f.getIp())) {
                DeviceLoginControl deviceLoginControl = new DeviceLoginControl(new DisConnect(), new HaveReConnect());
                if (loginRetry(f, deviceLoginControl)) {
                    deviceLoginControl.setCycleTime(f.getCycleTime());
                    deviceLoginControl.setVideoStoragePath(f.getVideoStoragePath());
                    deviceLoginControl.setCleanCycle(f.getCleanCycle());
                    deviceLogin.put(f.getIp(), deviceLoginControl);
                }
            }
        });

    }

    public Map<String, DeviceLoginControl> getDeviceLogin() {
        return deviceLogin;
    }

    public class fCaptureReceiveCB implements NetSDKLib.fSnapRev {
        BufferedImage bufferedImage = null;

        public void invoke(NetSDKLib.LLong lLoginID, Pointer pBuf, int RevLen, int EncodeType, int CmdSerial, Pointer dwUser) {
            if (pBuf != null && RevLen > 0) {
                String strFileName = SavePath.getSavePath().getSaveCapturePath();

                System.out.println("strFileName = " + strFileName);

                byte[] buf = pBuf.getByteArray(0, RevLen);
                ByteArrayInputStream byteArrInput = new ByteArrayInputStream(buf);
                try {
                    bufferedImage = ImageIO.read(byteArrInput);
                    if (bufferedImage == null) {
                        return;
                    }
                    ImageIO.write(bufferedImage, "jpg", new File(strFileName));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public class DisConnect implements NetSDKLib.fDisConnect {
        /**
         * 斷線(xiàn)回調(diào)
         *
         * @param m_hLoginHandle
         * @param pchDVRIP
         * @param nDVRPort
         * @param dwUser
         */
        public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
            System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort);
            if (deviceLogin.containsKey(pchDVRIP)) {
                synchronized (deviceLogin) {
                    if (deviceLogin.containsKey(pchDVRIP)) {
                        DeviceLoginControl deviceLoginControl = deviceLogin.get(pchDVRIP);
                        deviceLogin.remove(pchDVRIP);
                        deviceLogin.put("DisConnect-" + pchDVRIP, deviceLoginControl);
                    }
                }
            }
            Res.string().getDisConnectReconnecting();
        }
    }

    private class HaveReConnect implements NetSDKLib.fHaveReConnect {
        public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
            System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
            if (deviceLogin.containsKey("DisConnect-" + pchDVRIP)) {
                synchronized (deviceLogin) {
                    if (deviceLogin.containsKey("DisConnect-" + pchDVRIP)) {
                        DeviceLoginControl deviceLoginControl = deviceLogin.get("DisConnect-" + pchDVRIP);
                        deviceLogin.remove("DisConnect-" + pchDVRIP);
                        deviceLogin.put(pchDVRIP, deviceLoginControl);
                    }
                }
            }
            Res.string().getOnline();
        }
    }
}

調(diào)用的接口

package com.web.device.manage.controller;

import com.fasterxml.jackson.core.type.TypeReference;
import com.netsdk.api.DeviceLoginControl;
import com.netsdk.api.PtzControl;
import com.netsdk.lib.NetSDKLib;
import com.web.common.constant.WebConstant;
import com.web.common.entity.web.Failure;
import com.web.common.entity.web.Result;
import com.web.common.utils.BeanUtils;
import com.web.common.web.BaseController;
import com.web.device.manage.DeviceContext;
import com.web.device.manage.entity.CameraDeviceEntity;
import com.web.device.manage.model.response.CameraDeviceResponseModel;
import com.web.device.manage.service.CameraDeviceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Slf4j
@RestController
@RequestMapping(WebConstant.RequestMappingConstant.CAMERA_DEVICE)
public class CameraDeviceController extends BaseController {
    @Resource
    private CameraDeviceService cameraDeviceService;
    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private DeviceContext deviceContext;

    @RequestMapping(WebConstant.RequestMappingConstant.LIST)
    public Result list() {
        return executor(e -> {
            List<CameraDeviceEntity> cameraDevices = cameraDeviceService.list();
            e.put("cameraDevices", BeanUtils.convertListToList(cameraDevices, new TypeReference<List<CameraDeviceResponseModel>>() {
            }));
        }, f -> Failure.instance(WebConstant.Code.ERROR, f.getMessage()));
    }

    @RequestMapping("/download")
    public void download(@RequestBody Map<String, String> params, HttpServletResponse response) {
        try {
            // path是指想要下載的文件的路徑
            File file = new File(params.get("path"));
            log.info(file.getPath());
            // 獲取文件名
            String filename = file.getName();
            // 獲取文件后綴名
            String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
            log.info("文件后綴名:" + ext);

            // 將文件寫(xiě)入輸入流
            FileInputStream fileInputStream = new FileInputStream(file);
            InputStream fis = new BufferedInputStream(fileInputStream);
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();

            // 清空response
            response.reset();
            // 設(shè)置response的Header
            response.setCharacterEncoding("UTF-8");
            //Content-Disposition的作用:告知瀏覽器以何種方式顯示響應(yīng)返回的文件,用瀏覽器打開(kāi)還是以附件的形式下載到本地保存
            //attachment表示以附件方式下載   inline表示在線(xiàn)打開(kāi)   "Content-Disposition: inline; filename=文件名.mp3"
            // filename表示文件的默認(rèn)名稱(chēng),因?yàn)榫W(wǎng)絡(luò)傳輸只支持URL編碼的相關(guān)支付,因此需要將文件名URL編碼后進(jìn)行傳輸,前端收到后需要反編碼才能獲取到真正的名稱(chēng)
            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(params.containsKey("name") ? params.get("name") : new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + "." + ext, "UTF-8"));
            // 告知瀏覽器文件的大小
            response.addHeader("Content-Length", "" + file.length());
            OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            outputStream.write(buffer);
            outputStream.flush();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    @RequestMapping(WebConstant.RequestMappingConstant.SET_CLEAN_CYCLE)
    public Result setCleanCycle(@PathVariable("cycle") Integer cycle) {
        return executor(e -> {
            redisTemplate.opsForValue().set("cleanCycle", cycle);
        }, f -> Failure.instance(WebConstant.Code.ERROR, f.getMessage()));
    }

    @RequestMapping(WebConstant.RequestMappingConstant.GET_CLEAN_CYCLE)
    public Result getCleanCycle() {
        return executor(e -> {
            Object cleanCycle = redisTemplate.opsForValue().get("cleanCycle");
            if (cleanCycle == null) {
                redisTemplate.opsForValue().set("cleanCycle", 7);
                e.put("cycle", 7);
            } else {
                e.put("cycle", cleanCycle);
            }
        }, f -> Failure.instance(WebConstant.Code.ERROR, f.getMessage()));
    }

    @RequestMapping(WebConstant.RequestMappingConstant.PTZ_CONTROL)
    public Result ptzControl(@RequestBody Map<String, Object> params) {
        return executor(e -> {
            Map<String, DeviceLoginControl> deviceLogin = deviceContext.getDeviceLogin();
            DeviceLoginControl deviceLoginControl = deviceLogin.get(params.get("deviceIp"));
            if (!PtzControl.ptzControlStart(deviceLoginControl.getM_hLoginHandle(), (Integer) params.get("type"))) {
                throw new RuntimeException("控制失敗");
            }
            Thread.sleep(500);
            if (!PtzControl.ptzControlEnd(deviceLoginControl.getM_hLoginHandle(), (Integer) params.get("type"))) {
                throw new RuntimeException("控制失敗");
            }
        }, f -> Failure.instance(WebConstant.Code.ERROR, f.getMessage()));
    }


}

注意

libs的加載地址要指定
大華攝像頭開(kāi)發(fā)文檔,Sdk,java

碼云地址

dahua-device文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-808417.html

到了這里,關(guān)于大華攝像頭windows、linuxJavaSDK開(kāi)發(fā)使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 大華攝像頭有問(wèn)題,??禂z像頭也有問(wèn)題

    買(mǎi)了個(gè)大華攝像頭,除了抗噪方面效果不好,我是很滿(mǎn)意的。前一段時(shí)間攝像頭啟動(dòng)出了點(diǎn)問(wèn)題(忘記拔掉SD卡),于是買(mǎi)了個(gè)海康的。 大華攝像頭是3寸,??凳?寸。視頻效果差多了??磥?lái)大有大的道理。 更可恨的是,螢石云不支持這個(gè)攝像頭(說(shuō)是要插錄像機(jī))。買(mǎi)的時(shí)

    2024年02月11日
    瀏覽(21)
  • web接入大華攝像頭實(shí)時(shí)視頻

    web接入大華攝像頭實(shí)時(shí)視頻

    目錄 一、FFmpeg下載及配置???? 二、nginx下載及配置 三、攝像rtsp取流 四、ffmpeg推流 五、html前端工作 地址:Download FFmpeg ?? 下載并解壓FFmpeg文件夾,配置環(huán)境變量:在“Path”變量原有變量值內(nèi)容上加上d:ffmpegbin,驗(yàn)證:ffmpeg -version 出現(xiàn)版本號(hào)則成功。 這個(gè)我之前有,

    2023年04月20日
    瀏覽(22)
  • Java對(duì)接大華攝像頭SDK

    Java對(duì)接大華攝像頭SDK

    大華SDK下載地址:https://support.dahuatech.com/tools/sdkExploit 開(kāi)發(fā)操作系統(tǒng):Windows10-64位 服務(wù)器操作系統(tǒng):linux 64位 sdk版本:設(shè)備網(wǎng)絡(luò)SDK_JAVA_Linux64_V3.055.0000000.1.R.221027 我下載的是JAVA-win64和JAVA_Linux64版本(如果是用linux開(kāi)發(fā)可以只下載linux版本,因?yàn)槲冶镜厥荳indows,運(yùn)行時(shí)有些包需要

    2024年02月16日
    瀏覽(23)
  • ??將大華攝像頭畫(huà)面接入U(xiǎn)nity 【1】配置硬件和初始化攝像頭

    ??將大華攝像頭畫(huà)面接入U(xiǎn)nity 【1】配置硬件和初始化攝像頭

    目前的設(shè)想是后期采用網(wǎng)口供電的形式把畫(huà)面?zhèn)鞒鰜?lái),所以這邊我除了大華攝像頭還準(zhǔn)備了POE供電交換機(jī),為了方便索性都用大華的了,然后全都連接電腦主機(jī)即可。 這邊初始化攝像頭需要用到大華的Configtool軟件,下載地址如下。 全部-浙江大華技術(shù)股份有限公司 (dahuatech

    2024年02月21日
    瀏覽(20)
  • python_獲取網(wǎng)絡(luò)(大華)攝像頭畫(huà)面,并存儲(chǔ)為圖片和視頻

    網(wǎng)絡(luò)攝像頭 USB攝像頭

    2024年02月12日
    瀏覽(19)
  • Java對(duì)接大華云睿攝像頭(人流統(tǒng)計(jì)/客流量統(tǒng)計(jì))

    Java對(duì)接大華云睿攝像頭(人流統(tǒng)計(jì)/客流量統(tǒng)計(jì))

    環(huán)境準(zhǔn)備(注意區(qū)分開(kāi)發(fā)環(huán)境和正式服務(wù)器環(huán)境) 開(kāi)發(fā)環(huán)境 win11 + IDEA + spring boot + mysql 正式服務(wù)器環(huán)境 Linux 下載開(kāi)發(fā)環(huán)境和正式環(huán)境的SDK SDK下載地址:https://support.dahuatech.com/tools/sdkExploit ** 注意選擇對(duì)應(yīng)的語(yǔ)言和操作系統(tǒng) ** 打開(kāi)下載的(win64)SDK,查看人流統(tǒng)計(jì)部分實(shí)現(xiàn)邏

    2024年02月01日
    瀏覽(20)
  • windows驅(qū)動(dòng)開(kāi)發(fā)8:虛擬攝像頭方案

    一、攝像頭框架 在業(yè)務(wù)場(chǎng)景中,有許多是需要應(yīng)用能夠通過(guò)攝像頭的方式來(lái)訪(fǎng)問(wèn)相關(guān)的音視頻數(shù)據(jù),比如美顏、攝像頭多路復(fù)用、IP攝像頭接入視頻會(huì)議等。這些功能通過(guò)虛擬攝像頭的方式來(lái)實(shí)現(xiàn),是一個(gè)比較通用的解決方案。那么如何及選用哪種技術(shù)方案來(lái)開(kāi)發(fā)虛擬攝像頭

    2024年02月02日
    瀏覽(16)
  • JavaCv對(duì)接???、大華攝像頭SDK取流并轉(zhuǎn)推到RTMP服務(wù)器

    支持H265轉(zhuǎn)H264編碼 本文主要介紹???、大華SDK取流推流過(guò)程,這里就不展示對(duì)接???、大華SDK了 這個(gè)是重點(diǎn) Native.setCallbackThreadInitializer(this, new CallbackThreadInitializer(true, false, \\\"HikRealStream-\\\" + RandomUtil.randomNumbers(8))); 增加回放流速度控制 1. 引入JavaCv Maven依賴(lài),按需引入 2. 流處理類(lèi)

    2024年02月02日
    瀏覽(44)
  • ??怠⒋笕A、tplink監(jiān)控?cái)z像頭和硬盤(pán)錄像機(jī)接入GB28181平臺(tái)配置細(xì)節(jié)

    ??怠⒋笕A、tplink監(jiān)控?cái)z像頭和硬盤(pán)錄像機(jī)接入GB28181平臺(tái)配置細(xì)節(jié)

    ???、大華、tplink等各種型號(hào)監(jiān)控?cái)z像頭或硬盤(pán)錄像機(jī)(NVR/HVR)接入GB28181平臺(tái),配置過(guò)程都非常簡(jiǎn)單明了,但有些細(xì)節(jié)需要注意,避免走彎路踩泥坑。 首先要說(shuō)明一點(diǎn)的是,只要監(jiān)控設(shè)備和GB28181平臺(tái)的網(wǎng)絡(luò)是連通的,都可以順暢的接入,不需要為監(jiān)控設(shè)備配置外網(wǎng)地址,更不

    2024年02月07日
    瀏覽(26)
  • 【國(guó)標(biāo)語(yǔ)音對(duì)講】EasyCVR視頻匯聚平臺(tái)???大華/宇視攝像頭GB28181語(yǔ)音對(duì)講配置

    【國(guó)標(biāo)語(yǔ)音對(duì)講】EasyCVR視頻匯聚平臺(tái)???大華/宇視攝像頭GB28181語(yǔ)音對(duì)講配置

    近年來(lái),國(guó)內(nèi)視頻監(jiān)控應(yīng)用發(fā)展迅猛,系統(tǒng)接入規(guī)模不斷擴(kuò)大,涌現(xiàn)了大量平臺(tái)提供商,平臺(tái)提供商的接入?yún)f(xié)議各不相同,終端制造商需要給每款終端維護(hù)提供各種不同平臺(tái)的軟件版本,造成了極大的資源浪費(fèi)。各地視頻大規(guī)模建設(shè)后,省級(jí)、國(guó)家級(jí)集中調(diào)閱,對(duì)重特大事件

    2024年04月27日
    瀏覽(57)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包