Android实现对接海康摄像头SDK :实时预览功能+无预览下设备抓拍 附带效果图!!(2023最新最全教程)

2024-06-04 5505阅读

Android海康摄像头无预览设备抓拍+预览功能


文章目录

  • Android海康摄像头无预览设备抓拍+预览功能
  • 前言
  • 一、海康sdk下载 ,成功后SDK引入项目
    • 1.在gradle里面添加
    • 2.将海康SDK复制进jnilibs中
    • 4. 添加ndk(在Android defaultConfig中添加)
    • 4. 添加以下依赖
    • 二、代码实现登陆设备,抓拍图片,预览
      • 1.登陆设备(IP地址,端口号,用户名,密码)
      • 2.抓拍图片
      • 2.预览视频 使用surfaceview实现摄像头画面预览
      • 效果图(摄像头被供应商拿走了,只能放个测试图了)
      • 总结

        前言

        提示:海康摄像头的调试

        在海康官网 下载 ivms-4200 客户端,并且 摄像头和电脑在一个网段内,

        客户端会自动搜索 网段内的 摄像头。


        提示:以下是本篇文章正文内容,下面案例可供参考

        一、海康sdk下载 ,成功后SDK引入项目

        示例:应下载 设备网络SDK_Linux32 和 播放库SDK_Windows。(如下图)点击跳转Android实现对接海康摄像头SDK :实时预览功能+无预览下设备抓拍 附带效果图!!(2023最新最全教程) 第1张

        1.在gradle里面添加

        sourceSets {
         main {
         jniLibs.srcDir 'libs'
         }
        }
        

        2.将海康SDK复制进jnilibs中

        Android实现对接海康摄像头SDK :实时预览功能+无预览下设备抓拍 附带效果图!!(2023最新最全教程) 第2张

        Android实现对接海康摄像头SDK :实时预览功能+无预览下设备抓拍 附带效果图!!(2023最新最全教程) 第3张

        Android实现对接海康摄像头SDK :实时预览功能+无预览下设备抓拍 附带效果图!!(2023最新最全教程) 第4张

        3.更改SDKGuider.java中的文件路径

        Android实现对接海康摄像头SDK :实时预览功能+无预览下设备抓拍 附带效果图!!(2023最新最全教程) 第5张

        4. 添加ndk(在Android defaultConfig中添加)

        ndk {
        	abiFilters "armeabi-v7a", "arm64-v8a"
        }
        

        4. 添加以下依赖

        implementation fileTree(include: ['*.jar'], dir: 'libs')
        

        二、代码实现登陆设备,抓拍图片,预览

        1.登陆设备(IP地址,端口号,用户名,密码)

        代码如下(示例): 初始化时调用即可

        /**
             * @return login ID
             * @fn loginNormalDevice
             * @author lsw8569013
             * @brief login on device
             */
            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) {
                    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.e(TAG, "NET_DVR_Login is Successful!");
                return iLogID;
            }
        

        2.抓拍图片

        代码如下(示例):

        /**
             * 摄像头抓图
             * @param view
             */
            public void getPIC(View view) {
                String path = Environment.getExternalStorageDirectory()+"/抓图.jpg";
                NET_DVR_JPEGPARA jpegpara = new NET_DVR_JPEGPARA();
                jpegpara.wPicSize = 2;
                jpegpara.wPicQuality = 2;
                HCNetSDK NetSdk = HCNetSDK.getInstance();
                boolean b = NetSdk.NET_DVR_CaptureJPEGPicture(m_iLogID, 1, jpegpara, path);
                if(b){
                    LogUtil.e("抓图成功");
                    ImageView iv_showCAMERAPic = findViewById(R.id.iv_showCAMERAPic);
                    iv_showCAMERAPic.setImageBitmap(BitmapFactory.decodeFile(path));
                }else{
                    LogUtil.e("抓图error"+NetSdk.NET_DVR_GetLastError() ) ;
                }
            }
        

        2.预览视频 使用surfaceview实现摄像头画面预览

        代码如下(示例):

        public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
        private int m_iPreviewHandle = -1;
        @Override
        public void surfaceCreated(@NonNull SurfaceHolder holder) {
            m_surfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
            if (-1 == m_iPreviewHandle) {
                return;
            }
            Surface surface = holder.getSurface();
            if (surface.isValid()) {
                if (-1 == SDKGuider.g_sdkGuider.m_comPreviewGuider.RealPlaySurfaceChanged_jni(m_iPreviewHandle, 0, holder))
                    Toast.makeText(MainActivity.this,"NET_DVR_PlayBackSurfaceChanged"+ SDKGuider.g_sdkGuider.GetLastError_jni(),Toast.LENGTH_SHORT).show();
            }
        }
        @Override
        public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
        }
        @Override
        public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
            if (-1 == m_iPreviewHandle) {
                return;
            }
            if (holder.getSurface().isValid()) {
                if (-1 == SDKGuider.g_sdkGuider.m_comPreviewGuider.RealPlaySurfaceChanged_jni(m_iPreviewHandle, 0, null))
                {
                    Toast.makeText(MainActivity.this,"NET_DVR_RealPlaySurfaceChanged"+ SDKGuider.g_sdkGuider.GetLastError_jni(),Toast.LENGTH_SHORT).show();
                }
            }
        }
        }
        

        添加“开始预览”按钮,并添加点击事件

        private SurfaceView m_surfaceView = null;
        private Button start;
        private SurfaceHolder holder;
        m_surfaceView = findViewById(R.id.Surface_Preview_Play);
        holder = m_surfaceView.getHolder();
        start = findViewById(R.id.button_preview_start);
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                m_surfaceView.getHolder().addCallback(MainActivity.this);
                m_surfaceView.setZOrderOnTop(true);
                SDKGuider.g_sdkGuider.m_comPreviewGuider.RealPlaySurfaceChanged_jni(m_iPreviewHandle, 0, holder);
                NET_DVR_PREVIEWINFO struPlayInfo = new NET_DVR_PREVIEWINFO();
                struPlayInfo.lChannel = 1;
                struPlayInfo.dwStreamType = 0;
                struPlayInfo.bBlocked = 1;
                struPlayInfo.hHwnd = m_surfaceView.getHolder();
                m_iPreviewHandle = SDKGuider.g_sdkGuider.m_comPreviewGuider.RealPlay_V40_jni(0,struPlayInfo, null);
                if (m_iPreviewHandle  
        

        添加“停止预览”按钮,并添加点击事件

        private Button stop;
        stop = findViewById(R.id.button_stop);
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!SDKGuider.g_sdkGuider.m_comPreviewGuider.RealPlay_Stop_jni(m_iPreviewHandle))
                {
                     Toast.makeText(getContext(),"摄像头停止预览失败" + m_iPreviewHandle + "  错误代码:" + SDKGuider.g_sdkGuider.GetLastError_jni(),Toast.LENGTH_SHORT).show();
                     return;
                }
                m_iPreviewHandle = -1;
            }
        });
        

        退出时,释放SDK资源

        if (HCNetSDKJNAInstance.getInstance().NET_DVR_Cleanup()){
            Toast.makeText(getContext(), "摄像机SDK释放成功", Toast.LENGTH_SHORT).show();
        }
        

        效果图(摄像头被供应商拿走了,只能放个测试图了)

        Android实现对接海康摄像头SDK :实时预览功能+无预览下设备抓拍 附带效果图!!(2023最新最全教程) 第6张

        创作不易,各位看官老爷多多支持!~

        总结

        提示:好了本次技术交流就在这里结束啦!以上方法本人亲测有效坑还是挺多的 像传统的通过对二进制数组解码,可以得到bitma抓拍这种方式延迟久,而且内存占据很大,我们抓拍的方式是本人亲测最快的一种了,当然像sdk初始化,预览这些官网里都是有源代码的


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]