Android 集成海康威视监控 SDK,实现监控录像的查看

Android 集成海康威视监控 SDK,实现监控录像的查看

配置

切换Android studio 到project目录下,分别将jar包与armeabi包复制进去lib文件夹下:

设置app bulid.gradle文件 主要是添加CPU限制 只支持32位 以及添加so包的路径、添加jar包依赖:

添加权限

  1. <uses-permission android:name="android.permission.INTERNET" />
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  3. <uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT"/>
  4. <uses-permission android:name="android.permission.RECORD_AUDIO"/>

SDK使用

在调用摄像头的Activity的oncreate()中初始化SDK

private boolean initeSdk() {
    // init net sdk
    if (!HCNetSDK.getInstance().NET_DVR_Init()) {
        Log.e(TAG, "HCNetSDK init is failed!");
        return false;
    }
    HCNetSDK.getInstance().NET_DVR_SetLogToFile(3, "/mnt/sdcard/sdklog/",true);//log保存的路径
    return true;
}

 登陆

private int loginNormalDevice() {
    // get instance
    m_oNetDvrDeviceInfoV30 = new NET_DVR_DEVICEINFO_V30();
    if (null == m_oNetDvrDeviceInfoV30) {
        Log.e(TAG, "HKNetDvrDeviceInfoV30 new is failed!");
        return -1;
    }
    // call NET_DVR_Login_v30 to login on, port 8000 as default
    int iLogID = HCNetSDK.getInstance().NET_DVR_Login_V30(ADDRESS, PORT,
            USER, PSD, m_oNetDvrDeviceInfoV30);
    if (iLogID < 0) {
        Log.e(TAG, "NET_DVR_Login is failed!Err:"
                + HCNetSDK.getInstance().NET_DVR_GetLastError());
        return -1;
    }
    if (m_oNetDvrDeviceInfoV30.byChanNum > 0) {
        m_iStartChan = m_oNetDvrDeviceInfoV30.byStartChan;
        m_iChanNum = m_oNetDvrDeviceInfoV30.byChanNum;
    } else if (m_oNetDvrDeviceInfoV30.byIPChanNum > 0) {
        m_iStartChan = m_oNetDvrDeviceInfoV30.byStartDChan;
        m_iChanNum = m_oNetDvrDeviceInfoV30.byIPChanNum
                + m_oNetDvrDeviceInfoV30.byHighDChanNum * 256;
    }
    Log.i(TAG, "NET_DVR_Login is Successful!");
    return iLogID;
}

 相机预览

//预览
final NET_DVR_PREVIEWINFO ClientInfo = new NET_DVR_PREVIEWINFO();
ClientInfo.lChannel = 0;
ClientInfo.dwStreamType = 0; // substream
ClientInfo.bBlocked = 1;
//设置默认点
thread = new Thread(new Runnable() {
    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            SystemClock.sleep(1000);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (isShow)
                        startSinglePreview();//预览
                }
            });
        }
    }
});
thread.start();

预览摄像头需要开启线程,监听预览成功后停止线程,不然界面会显示黑色。

startSinglePreview()代码:

private void startSinglePreview() {
    if (m_iPlaybackID >= 0) {
        Log.i(TAG, "Please stop palyback first");
        return;
    }
    RealPlayCallBack fRealDataCallBack = getRealPlayerCbf();
    if (fRealDataCallBack == null) {
        Log.e(TAG, "fRealDataCallBack object is failed!");
        return;
    }
    Log.i(TAG, "m_iStartChan:" + m_iStartChan);
    NET_DVR_PREVIEWINFO previewInfo = new NET_DVR_PREVIEWINFO();
    previewInfo.lChannel = m_iStartChan;
    previewInfo.dwStreamType = 0; // substream
    previewInfo.bBlocked = 1;
    m_iPlayID = HCNetSDK.getInstance().NET_DVR_RealPlay_V40(m_iLogID,
            previewInfo, fRealDataCallBack);
    if (m_iPlayID < 0) {
        Log.e(TAG, "NET_DVR_RealPlay is failed!Err:"
                + HCNetSDK.getInstance().NET_DVR_GetLastError());
        return;
    }
    isShow = false;
    if (NotNull.isNotNull(thread)) {
        thread.interrupt();
    }
    h1 = new CameraManager();
    h1.setLoginId(m_iLogID);
    Intent intent = getIntent();
    if (NotNull.isNotNull(intent) && intent.getIntExtra("INDEX", -1) != -1) {
        int point = app.preferences.getInt("POINT", 0);
        boolean b = HCNetSDK.getInstance().NET_DVR_PTZPreset(m_iPlayID, PTZCommand.GOTO_PRESET,
                point);
    }
}

 控制台操作

@Override
public boolean onTouch(final View v, final MotionEvent event) {
    if (!NotNull.isNotNull(h1)) return false;
    Log.d(TAG, "onTouch: ");
    new Thread() {
        @Override
        public void run() {
            switch (v.getId()) {
                case R.id.btn_Up:
                    if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        h1.startMove(8, m_iLogID);
                    }
                    if (event.getAction() == MotionEvent.ACTION_UP) {
                        h1.stopMove(8, m_iLogID);
                    }
                    break;
                case R.id.btn_Left:
                    if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        h1.startMove(4, m_iLogID);
                    }
                    if (event.getAction() == MotionEvent.ACTION_UP) {
                        h1.stopMove(4, m_iLogID);
                    }
                    break;
                case R.id.btn_Right:
                    if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        h1.startMove(6, m_iLogID);
                    }
                    if (event.getAction() == MotionEvent.ACTION_UP) {
                        h1.stopMove(6, m_iLogID);
                    }
                    break;
                case R.id.btn_Down:
                    if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        h1.startMove(2, m_iLogID);
                    }
                    if (event.getAction() == MotionEvent.ACTION_UP) {
                        h1.stopMove(2, m_iLogID);
                    }
                    break;
                case R.id.btn_ZoomIn:
                    if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        h1.startZoom(1, m_iLogID);
                    }
                    if (event.getAction() == MotionEvent.ACTION_UP) {
                        h1.stopZoom(1, m_iLogID);
                    }
                    break;
                case R.id.btn_ZoomOut:
                    if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        h1.startZoom(-1, m_iLogID);
                    }
                    if (event.getAction() == MotionEvent.ACTION_UP) {
                        h1.stopZoom(-1, m_iLogID);
                    }
                    break;
                default:
                    break;
            }
        }
    }.start();
    return false;
}

/**
 * 停止移动 NET_DVR_PTZControl_Other参数:(播放标记, 通道, 指令码, 开始标记0或停止标记1)
 *
 * @param orientation 九宫格数字方向
 */
public void stopMove(int orientation, int m_iLogID) {
    if (m_iLogID < 0) {
        return;
    }
    switch (orientation) {
        case 9:
            HCNetSDK.getInstance().NET_DVR_PTZControl_Other(m_iLogID, 1,
                    PTZCommand.UP_RIGHT, 1);
            break;
        case 8:
            HCNetSDK.getInstance().NET_DVR_PTZControl_Other(m_iLogID, 1,
                    PTZCommand.TILT_UP, 1);
            break;
        case 7:
            HCNetSDK.getInstance().NET_DVR_PTZControl_Other(m_iLogID, 1,
                    PTZCommand.UP_LEFT, 1);
            break;
        case 6:
            HCNetSDK.getInstance().NET_DVR_PTZControl_Other(m_iLogID, 1,
                    PTZCommand.PAN_RIGHT, 1);
            break;
        case 5:
            HCNetSDK.getInstance().NET_DVR_PTZControl_Other(m_iLogID, 1,
                    PTZCommand.PAN_AUTO, 1);
            break;
        case 4:
            HCNetSDK.getInstance().NET_DVR_PTZControl_Other(m_iLogID, 1,
                    PTZCommand.PAN_LEFT, 1);
            break;
        case 3:
            HCNetSDK.getInstance().NET_DVR_PTZControl_Other(m_iLogID, 1,
                    PTZCommand.DOWN_RIGHT, 1);
            break;
        case 2:
            HCNetSDK.getInstance().NET_DVR_PTZControl_Other(m_iLogID, 1,
                    PTZCommand.TILT_DOWN, 1);
            break;
        case 1:
            HCNetSDK.getInstance().NET_DVR_PTZControl_Other(m_iLogID, 1,
                    PTZCommand.DOWN_LEFT, 1);
            break;
        default:
            break;
    }
}

说得再多不如代码一坨

Github传送门

以上讲的是旧版本,转自 wangguan_9527   博客地址  海康威视 Android studio 集成使用_wangguan_9527的博客-CSDN博客

2022年新版本:

SDK(代码比较繁琐,不易看懂)地址:海康开放平台(设备网络SDK_Android V6.1.9.4_build20220412)

对sdk进行了缩减,源码地址:HKSDK_demo: 2022年Android版海康威视摄像头视频最新版sdk接入。

另外两种播放IP摄像头视频的方式

1、通过libvlc库,使用rtsp的方式获取视频流 : 

GitHub - zxrmmxt/SampleVlcRtspPlay: Android VLC RTSP播放

 2、使用vlc进行IP 摄像机观看:

https://github.com/damianhoppe/RTSP-Player

  • 6
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值