`
yo8237233
  • 浏览: 62957 次
  • 来自: 深圳
社区版块
存档分类
最新评论

Android海康监控视频调用demo

阅读更多
一、 开发环境
1、 操作系统:windows7(X64)
2、 开发工具:eclipse adt Build: v22.2.1-833290 JDK7 android SDK
3、 客户端设备版本:HUAWEI C8813 android 4.1.1
4、 监控设备型号:HIK/DS-8116HC-F/AF-DVR-II-B/16-16
5、 所需库文件(SDK):海康视频8116 播放库和网络库

二、 开发背景
    目前的DVR所监控的视频只能在IE下实时预览,先应项目需要在移动平台进行实时预览

三、 环境搭建
1、 创建android工程在libs目录下导入开发项目所需要的依赖架包和库文件
2、 编写活动主页面
3、 编写主activity其中有一个广播接收器StartRenderingReceiver
4、 编写设备实体类
5、 编写视频播放核心类所有的状态-1 均表示未完成
6、 给项目赋权限

四、 相关说明
先介绍下为什麽要用两个sdk,海康威视android 网络库是用来与设备建立远程连接,音、视频解码,进行实时预览、回放等等功能的,但是它所得到的仅仅是二进制的音、视频数据而已,要真正的显示到手机界面上,还需要海康威视android 播放库sdk得支持,通过播放库sdk,才可以将视频显示到SurfaceView之上。流程如下图




核心代码如下:
public class HC_DVRManager {

    private final static String TAG = "HC_DEBUG";
    public final static String ACTION_START_RENDERING = "action_start_rendering";
    public final static String ACTION_DVR_OUTLINE = "action_dvr_outline";
    /**
     * 设备信息
     * 模拟通道数bychannum
     * 数字通道数byipchanum
     */
    private NET_DVR_DEVICEINFO_V30 deviceInfo_V30 = null;
    /**
     * 登入标记 -1未登入,0已登入
     */
    private int m_iLogID = -1;

    /**
     * 播放标记 -1未播放,0正在播放
     */
    private int m_iPlayID = -1;
    private int m_iPort = -1;
    private String ip;
    private int port;
    private String username;
    private String password;
    private int channel;
    private SurfaceHolder holder;
    /**
     * 用于发广播的上下文
     */
    private Context context;

    private static HC_DVRManager manager = null;

    private HC_DVRManager() {
    }

    public static synchronized HC_DVRManager getInstance() {
        if (manager == null) {
            manager = new HC_DVRManager();
        }
        return manager;
    }

    /**
     * 设置播放设备信息
     * 
     * @param bean
     */
    public void setDeviceBean(DeviceBean bean) {
        this.ip = bean.getIP();
        this.port = Integer.parseInt(bean.getPort());
        this.username = bean.getUserName();
        this.password = bean.getPassWord();
        this.channel = Integer.parseInt(bean.getChannel());
    }

    /**
     * 设置播放视口
     * @param holder
     */
    public void setSurfaceHolder(SurfaceHolder holder) {
        this.holder = holder;
    }

    /**
     * 用于发送广播的上下文
     * @param context
     */
    public void setContext(Context context) {
        this.context = context;
    }

    public void initSDK() {
        if (m_iPlayID >= 0) {
            stopPlay();
        }
        if (HCNetSDK.getInstance().NET_DVR_Init()) {
            Log.i(TAG, "初始化SDK成功!");
        } else {
            Log.e(TAG, "初始化SDK失败!");
        }
    }

    public void loginDevice() {
        deviceInfo_V30 = new NET_DVR_DEVICEINFO_V30();
        m_iLogID = HCNetSDK.getInstance().NET_DVR_Login_V30(ip, port, username, password, deviceInfo_V30);
        
		System.out.println("下面是设备信息************************");
		System.out.println("userId=" + m_iLogID);
		System.out.println("通道开始=" + deviceInfo_V30.byStartChan);
		System.out.println("通道个数=" + deviceInfo_V30.byChanNum);
		System.out.println("设备类型=" + deviceInfo_V30.byDVRType);
		System.out.println("ip通道个数=" + deviceInfo_V30.byIPChanNum);
        
        if (m_iLogID < 0) {
            Log.e(TAG, "登入设备失败!" + getErrorMsg(HCNetSDK.getInstance().NET_DVR_GetLastError()));
        } else {
            Log.i(TAG, "登入设备成功!");
        }
    }

    public synchronized void realPlay() {
        try {
            if (m_iLogID < 0) {
                Log.e(TAG, "尝试重新登入");
                int count = 0;
                while (count < 10) {
                    Log.i(TAG, "正在第" + (count + 1) + "次重新登入");
                    loginDevice();
                    if (m_iLogID < 0) {
                        count++;
                        Thread.sleep(200);
                    } else {
                        Log.i(TAG, "第" + (count + 1) + "次登入成功");
                        break;
                    }
                }
                if (m_iLogID < 0) {
                    Log.e(TAG, "尝试登入" + count + "次均失败!");
                    return;
                }
            }

            if (m_iPlayID < 0) {
            	//预览参数配置
                NET_DVR_CLIENTINFO ClientInfo = new NET_DVR_CLIENTINFO();
                ClientInfo.lChannel = channel + deviceInfo_V30.byStartChan;
                ClientInfo.lLinkMode = 0;
                // 多播地址,需要多播预览时配置 
                ClientInfo.sMultiCastIP = null;
                
                m_iPlayID = HCNetSDK.getInstance().NET_DVR_RealPlay_V30(m_iLogID, ClientInfo, getRealPlayerCallBack(), true);
                if (m_iPlayID < 0) {
                    Log.e(TAG, "实时播放失败!" + getErrorMsg(HCNetSDK.getInstance().NET_DVR_GetLastError()));
                    if (HCNetSDK.getInstance().NET_DVR_GetLastError() == 416) {
                    	//发送广播
                        context.sendBroadcast(new Intent(ACTION_DVR_OUTLINE));
                    }
                    return;
                } else {
                    Log.i(TAG, "开始实时播放!");
                }
            } else {
                Log.d(TAG, "正在播放中?");
            }
        } catch (Exception e) {
            Log.e(TAG, "异常:" + e.toString());
        }
    }
    
    /**
     * 获取实时播放回调
     * 
     * @return
     */
    private RealPlayCallBack getRealPlayerCallBack() {
        return new RealPlayCallBack() {
        	/**
        	 * iRealHandle 当前的预览句柄
        	 * iDataType 数据类型
        	 * pDataBuffer 存放数据的缓冲区指针
        	 * iDataSize 缓冲区大小
        	 */
            @Override
            public void fRealDataCallBack(int iRealHandle, int iDataType, byte[] pDataBuffer, int iDataSize) {
                processRealData(iDataType, pDataBuffer, iDataSize, Player.STREAM_REALTIME);
            }
        };
    }

    /**
     * 停止播放
     */
    public synchronized void stopPlay() {
        if (m_iPlayID < 0) {
            Log.d(TAG, "已经停止?");
            return;
        }
        // 停止网络播放
        if (HCNetSDK.getInstance().NET_DVR_StopRealPlay(m_iPlayID)) {
            Log.i(TAG, "停止实时播放成功!");
        } else {
            Log.e(TAG, "停止实时播放失败!" + getErrorMsg(HCNetSDK.getInstance().NET_DVR_GetLastError()));
            return;
        }
        // 停止本地播放
        if (Player.getInstance().stop(m_iPort)) {
            Log.i(TAG, "停止本地播放成功!");
        } else {
            Log.e(TAG, "停止本地播放失败!");
            return;
        }
        // 关闭视频流
        if (Player.getInstance().closeStream(m_iPort)) {
            Log.i(TAG, "关闭视频流成功!");
        } else {
            Log.e(TAG, "关闭视频流失败!");
            return;
        }
        // 释放播放端口
        if (Player.getInstance().freePort(m_iPort)) {
            Log.i(TAG, "释放播放端口成功!");
        } else {
            Log.e(TAG, "释放播放端口失败!");
            return;
        }
        // 播放端口复位
        m_iPort = -1;
        // 正在播放标记复位
        m_iPlayID = -1;
        Log.i(TAG, "停止播放成功!");
    }

    /**
     * 登出设备
     */
    public void logoutDevice() {
        if (HCNetSDK.getInstance().NET_DVR_Logout_V30(m_iLogID)) {
            m_iLogID = -1;
            Log.i(TAG, "登出设备成功!");
        } else {
            m_iLogID = 0;
            Log.e(TAG, "登出设备失败!" + getErrorMsg(HCNetSDK.getInstance().NET_DVR_GetLastError()));
        }
    }

    /**
     * 释放海康SDK
     */
    public void freeSDK() {
        // 清理缓存
        if (HCNetSDK.getInstance().NET_DVR_Cleanup()) {
            Log.i(TAG, "释放SDK资源成功!");
        } else {
            Log.e(TAG, "释放SDK资源失败!");
        }
    }


    /**
     * 视频流解码
     * 
     * @param iDataType
     * @param pDataBuffer
     * @param iDataSize
     * @param iStreamMode
     */
    private void processRealData(int iDataType, byte[] pDataBuffer, int iDataSize, int iStreamMode) {
        int i = 0;
        try {
            switch (iDataType) {
                case HCNetSDK.NET_DVR_SYSHEAD:
                    Log.d(TAG, "处理头数据");
                    if (m_iPort >= 0) {
                        break;
                    }
                    m_iPort = Player.getInstance().getPort();
                    if (m_iPort == -1) {
                        Log.e(TAG, "获取播放端口失败!");
                        break;
                    } else {
                        Log.i(TAG, "获取播放端口成功!");
                    }
                    if (iDataSize > 0) {
                        if (Player.getInstance().setStreamOpenMode(m_iPort, iStreamMode)) {
                            Log.i(TAG, "设置视频流成功!");
                        } else {
                            Log.e(TAG, "设置视频流失败!");
                            break;
                        }
                        
                        //抓图回调函数
                        PlayerDisplayCB displayCB = new PlayerDisplayCB() {
                            @Override
                            public void onDisplay(int arg0, ByteBuffer arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) {
                                if (null != context) {
                                    context.sendBroadcast(new Intent(ACTION_START_RENDERING));
                                } else {
                                    Log.e(TAG, "Context为空!没有setContext(Context context)?");
                                }
                                Log.d(TAG, "开始画面渲染");
                                if (Player.getInstance().setDisplayCB(m_iPort, null)) {
                                    Log.i(TAG, "移除显示回调成功!");
                                } else {
                                    Log.e(TAG, "移除显示回调失败!");
                                }
                            }
                        };
                        if (Player.getInstance().setDisplayCB(m_iPort, displayCB)) {
                            Log.i(TAG, "设置显示回调成功!");
                        } else {
                            Log.e(TAG, "设置显示回调失败!");
                            break;
                        }
                        if (Player.getInstance().setDisplayBuf(m_iPort, 10)) { // 帧率,不设置为默认15
                            Log.i(TAG, "设置播放缓冲区最大缓冲帧数成功!");
                        } else {
                            Log.e(TAG, "设置播放缓冲区最大缓冲帧数失败!");
                            break;
                        }
                        if (Player.getInstance().openStream(m_iPort, pDataBuffer, iDataSize, 2 * 1024 * 1024)) {
                            Log.i(TAG, "打开视频流成功!");
                        } else {
                            Log.e(TAG, "打开视频流失败!");
                            break;
                        }
                        if (Player.getInstance().play(m_iPort, holder)) {
                            Log.i(TAG, "本地播放成功!");
                        } else {
                            Log.e(TAG, "本地播放失败!");
                            break;
                        }
                    } else {
                        Log.e(TAG, "视频流无数据!");
                    }
                    break;
                case HCNetSDK.NET_DVR_STREAMDATA:
                case HCNetSDK.NET_DVR_STD_AUDIODATA:
                case HCNetSDK.NET_DVR_STD_VIDEODATA:
                    // Log.i(TAG, "处理流数据");
                    if (iDataSize > 0 && m_iPort != -1) {
                        for (i = 0; i < 400; i++) {
                            if (Player.getInstance().inputData(m_iPort, pDataBuffer, iDataSize)) {
                                Log.i(TAG, "输入数据成功!");
                                break;
                            }
                            Thread.sleep(10);
                        }
                        if (i == 400) {
                            Log.e(TAG, "输入数据失败!");
                        }
                    }
                    break;
                default:
                    break;
            }
        } catch (Exception e) {
            Log.e(TAG, "视频流解码异常!" + e.toString());
        }
    }


五、 项目运行相关









目前就介绍这么多了,大家需要源码的可以留下邮箱

注:转载请注明出处

博客地址:http://qiaoyihang.iteye.com/
  • 大小: 41.5 KB
  • 大小: 430.4 KB
  • 大小: 173.2 KB
  • 大小: 570.9 KB
分享到:
评论
20 楼 小英子 2018-03-16  
求demo   375681112@qq.om
19 楼 xch_yang 2017-11-27  
你好,请问能否发送一下这个demo给我呢,非常感谢。我的邮箱是xch_yang@126.com
18 楼 cheng8160 2017-11-12  
你好,请问能否发送一下这个demo给我呢,非常感谢。我的邮箱是cheng8160@163.com
17 楼 caonima186 2017-10-12  
你好 给我一份吧  谢谢 451007821@qq.com
16 楼 zhuangshuo 2017-09-23  
你好 给我一份吧  谢谢 919036095@qq.com
15 楼 zl123456789zl123 2017-06-12  
我也想要一个demo,可否麻烦发一份给我675673762@qq.com,,谢谢!!!
14 楼 mejunhuang 2017-06-01  
我也想要一个demo,可否麻烦发一份给我95582594@qq.com
13 楼 tmyzh 2017-05-11  
356589990@qq.com 能给我一份源码吗 ,最近在集成,获取m_iPlayID时总是小于0,画面出不来不知道什么原因
12 楼 183361056 2017-05-04  
你有电话吗,我QQ号  183361056@qq.com   给我发一份
11 楼 applepeipei 2017-03-22  
麻烦发我一下吧,719409618@qq.com,谢谢
10 楼 jzfwx 2017-03-17  
邮箱:jzfwx@qq.com
9 楼 jzfwx 2017-03-17  
你好!太及时了,正在搞手机软件,涉及到插入监控图像,麻烦发一个源码,感谢了。。。。
8 楼 jj631871243 2017-03-05  
你好,能发一份给我吗,万分感谢  310959078@qq.com
7 楼 xiamuwjm 2017-02-22  
你好,请问能不能发一份demo给我,我的邮箱是 2199837019@qq.com,非常感谢
6 楼 jzgl_javaeye 2017-01-22  
老大,麻烦帮我发一份:liuqt_2005@163.com
5 楼 wfl1334766964 2016-10-28  
你好,请问能否发送一下这个demo给我呢,非常感谢。我的邮箱是1334766964@qq.com
4 楼 sqlcsharpholl7 2016-10-27  
你好,请问能否发送一下这个demo给我呢,非常感谢。我的邮箱是1403049908@qq.com
3 楼 yo8237233 2014-07-22  
fly2think 写道
你好,请问能否发送一下这个demo给我呢,非常感谢。我的邮箱是djjackylei@gmail.com

http://download.csdn.net/detail/yo8237233/7129777
2 楼 fly2think 2014-07-11  
你好,请问能否发送一下这个demo给我呢,非常感谢。我的邮箱是djjackylei@gmail.com
1 楼 pxxaish9527 2014-05-26  
二、 开发背景
    目前的DVR所监控的视频只能在IE下实时预览,先应项目需要在移动平台进行实时预览


通过什么进行监控视频的实时预览的?

相关推荐

    Android 海康摄像头调用demo

    总的来说,Android海康摄像头调用demo是一个实用的教学实例,它揭示了如何在Android平台上高效地使用海康威视的SDK进行摄像头控制,同时也展示了JNI和多媒体处理在Android应用开发中的重要性。通过深入学习和实践这...

    海康威视视频监控android移动端调用

    【海康威视视频监控android移动端调用】项目是一个基于Android平台的应用,旨在实现对海康威视DS-8116HC DVR设备的视频监控功能。该项目适用于开发者或者有相关需求的用户,通过Android 4.1系统进行运行。在开发过程...

    海康威视安卓移动端摄像头调用demo

    【海康威视安卓移动端摄像头调用demo】是针对海康威视的监控设备在Android平台上进行摄像头控制和视频显示的应用示例。这个项目通常包括了SDK、API接口、示例代码以及必要的文档,帮助开发者了解如何在Android设备上...

    HK_API_JAVA_DEMO_海康视频控件_DEMO_智能_api-hk_

    标题中的“HK_API_JAVA_DEMO_海康视频控件_DEMO_智能_api-hk”揭示了这个项目的核心内容,即一个基于Java的演示程序,展示了如何利用海康提供的API接口来实现智能功能。 首先,我们要理解“海康视频控件”是干什么...

    海康威视Android网络库+播放库调用demo

    工程里包含了海康威视android sdk(网络库+播放库) 官网上只有android 播放库下载,没有...可以参考我的博文:海康威视远程监控Android端APP开发初探 http://blog.csdn.net/lihong08/article/details/9355691

    海康萤石云(EZVIZ)实时视频预览、对讲插件(Android+iOS)示例

    海康萤石云(EZVIZ)实时视频预览、对讲插件(Android+iOS)示例海康萤石云(EZVIZ)实时视频预览、对讲插件(Android+iOS)示例海康萤石云(EZVIZ)实时视频预览、对讲插件(Android+iOS)示例海康萤石云(EZVIZ)实时视频...

    海康威视SDK实例QtDemo显示NVR视频窗口(Linux+Qt)

    在《海康威视客户端iVMS-4200连接NVR》 https://blog.csdn.net/chentuo2000/article/details/119298486 一文中我们通过海康威视客户端iVMS-4200连接NVR。 本文我们通过海康SDK连接NVR。

    海康摄像头测试demo

    【海康摄像头测试demo】是基于Android Studio的一个项目,它主要展示了如何在Android平台上与海康威视的监控设备进行集成和交互。这个demo对于开发者来说是一个很好的学习资源,可以帮助理解如何在移动应用中实现...

    海康视频Android开发包

    海康视频Android开发包是一个专为开发者设计的工具包,旨在帮助他们集成海康视频监控设备的功能到Android应用中。这个开发包包含了丰富的资源和文档,使得开发者能够轻松地实现与海康视频设备的交互,如添加设备、...

    海康SDK的DEMO

    总结来说,海康SDK的DEMO是一个全面展示其功能的实例,开发者可以通过它深入学习海康设备的控制方法,视频处理技术,以及如何构建一个完整的监控系统。对于初次接触海康SDK的开发者,从DEMO入手是了解和掌握SDK的最...

    海康威视Demo

    通过深入研究和实践这个"海康威视Demo",开发者不仅可以掌握如何在Android平台上与海康威视的设备交互,还能理解安防监控系统的基本架构和工作原理,为开发更复杂的监控应用打下坚实基础。同时,熟悉海康威视的SDK也...

    Android 海康威视二次开发的小demo

    通过分析这个小demo,开发者可以学习如何在Android环境中搭建一个基本的监控系统,并进一步扩展到更复杂的功能,如实时视频分析、事件触发等。海康威视的SDK通常会提供详细的文档和示例代码,辅助开发者完成这些工作...

    海康威视摄像头调用Android源码示例.zip

    一个简单的demo源码,通过填写局域网中海康威视摄像头的ip地址,端口号(默认8000),用户名(默认admin)和密码(海康的默认密码是“admin”+机身验证码),可以在登录后浏览摄像头,还有回放、捕获、对讲等简单功能...

    海康最新APP开发Demo+Doc抓拍录像回放等

    本资源“海康最新APP开发Demo+Doc抓拍录像回放等”旨在为开发者提供一个完整的平台,用于进行海康APP的二次开发工作,以实现更个性化的监控功能。以下是基于提供的信息,对海康APP开发的关键知识点的详细解析: 1. ...

    大华网络摄像头视频播放Demo

    【大华网络摄像头视频播放Demo】是一个针对...综上所述,"大华网络摄像头视频播放Demo"是一个综合了网络通信、视频处理、服务器编程等多个领域的项目,对于理解和掌握现代视频监控系统的架构和实现有着重要的参考价值。

    海康威视android sdk和demo(最新)

    海康威视是全球领先的安防产品及解决方案提供商,其Android SDK和Demo对于开发者来说是实现Android设备连接海康威视监控设备的关键工具。这个资源包,"HCNetSDKV6.1.4.15_build20200307_android_ZH",包含了最新的...

    海康摄像头测试Demo

    【海康摄像头测试Demo】是基于Android平台的...通过深入研究和实践这个【海康摄像头测试Demo】,开发者可以掌握海康摄像头在Android环境下的完整功能开发,从而在物联网、智能家居、安防监控等领域实现更丰富的应用。

    海康威视android-demo

    总的来说,"海康威视android-demo"是一个实用的工具,它可以帮助开发者快速掌握海康威视IVMS系统在Android平台上的集成方法,从而创建出功能完备的监控应用程序。通过深入研究这个示例项目,开发者可以学习到如何将...

    海康网络SDK-Android

    海康网络SDK-Android是专为...总之,海康网络SDK-Android为Android开发者提供了强大的工具,简化了与海康网络设备的集成工作,使开发者可以专注于构建功能丰富的监控和安全应用,同时享受到高效、稳定的设备控制体验。

Global site tag (gtag.js) - Google Analytics