Android平台上集成大华SDK(二)

Android平台上集成大华SDK
以上是我之前写的一篇Android平台上集成大华SDK的文章,其中对于Android平台上集成大华SDK、基于大华SDK进行二次开发基本上进行了详细地介绍。

这篇文章,在之前的基础上我对代码进行了优化和封装,我们来看,

/**
 * Created by Administrator on 2017/3/1.
 * 封装的大华播放库
 */
public class PlayerDahua {
    private static final String TAG = "Dahua";
    private DeviceDisConnect disConnect = new DeviceDisConnect();  //网络断线处理,实现网络断线处理接口
    private NET_PARAM stNetParam = new NET_PARAM();  //设备登入时的相关参数
    private DeviceReConnect reConnect = new DeviceReConnect();  //设备连接恢复,实现设备连接恢复接口
    private DeviceSubDisConnect subDisConnect = new DeviceSubDisConnect();  //动态子连接断开处理,实现动态子连接断开处理接口
    private Test_CB_fMessageCallBack test_cb_fMessageCallBack = new Test_CB_fMessageCallBack();  //消息回调处理,实现消息回调接口
    private NET_DEVICEINFO deviceInfo = new NET_DEVICEINFO();  //设备信息
    private Integer error = new Integer(0);
    private int mPort;
    private long mLogId;
    private long mPlayId;
    private long mPlaybackId;
    private SurfaceView surfaceView;
    private Handler handler;
    static FileOutputStream m_Fout;

    public PlayerDahua(SurfaceView surfaceView, Handler handler) {
        this.surfaceView = surfaceView;
        this.handler = handler;
    }

    /**
     * 登录设备
     * @param ip
     * @param port
     * @param username
     * @param password
     */
    private void login(String ip, int port, String username, String password) {
        INetSDK.LoadLibrarys();  //加载动态库
        INetSDK.Init(disConnect);  //初始化大华的NetSDK
        INetSDK.SetConnectTime(4000, 2);  //设置连接超时时间为4秒,重连次数为2次
        stNetParam.nWaittime = 10000;  //设置等待超时时间为10秒
        stNetParam.nSearchRecordTime = 10000;  //设置按时间查询录像文件的超时时间为10秒
        INetSDK.SetNetworkParam(stNetParam);  //设置网络环境
        INetSDK.SetAutoReconnect(reConnect);  //设置断线重连
        INetSDK.SetSubconnCallBack(subDisConnect);  //设置动态子连接断线回调
        INetSDK.SetDVRMessCallBack(test_cb_fMessageCallBack);  //设置消息回调
        mLogId = INetSDK.LoginEx(ip, port, username, password, 20, null, deviceInfo, error);  //调用设备登录接口
        if (mLogId == 0) {  //登录失败
            LogUtils.e(TAG, "登录失败,错误码:" + INetSDK.GetLastError());
            messageFeedback("连接设备失败");
        }
    }

    /**
     * 实时预览
     * @param ip
     * @param port
     * @param userName
     * @param password
     * @param streamType
     * @param channelNo
     */
    public void live(String ip, int port, String userName, String password, int streamType, int channelNo) {
        if (mLogId == 0) {  //未登录设备,先登录设备
            login(ip, port, userName, password);
        }
        if (mLogId != 0) {  //已经登录设备,下一步:实时预览
            mPlayId = INetSDK.RealPlayEx(mLogId, channelNo, streamType);  //调用实时预览接口
            if (mPlayId == 0) {
                LogUtils.e(TAG, "实时预览失败,错误码:" + INetSDK.GetLastError());
                messageFeedback("实时预览失败");
            } else {
                mPort = IPlaySDK.PLAYGetFreePort();
                boolean bOpenRet = IPlaySDK.PLAYOpenStream(mPort, null, 0, 1024 * 1024 * 2) == 0 ? false : true;
                if (bOpenRet) {
                    boolean bPlayRet = IPlaySDK.PLAYPlay(mPort, surfaceView) == 0 ? false : true;
                    if (bPlayRet) {
                        IPlaySDK.PLAYPlaySoundShare(mPort);
                        TestRealDataCallBackEx m_callbac = new TestRealDataCallBackEx(mPort);
                        TestVideoDataCallBack m_VideoCallback = new TestVideoDataCallBack(m_Fout);
                        INetSDK.SetRealDataCallBackEx(mPlayId, m_callbac, 1);
                        messageFeedback(null);
                    } else {
                        IPlaySDK.PLAYCloseStream(mPort);
                        LogUtils.e(TAG, "实时预览失败,调用IPlaySDK.PLAYPlay接口失败");
                        messageFeedback("实时预览失败");
                    }
                } else {
                    LogUtils.e(TAG, "实时预览失败,调用IPlaySDK.PLAYOpenStream接口失败");
                    messageFeedback("实时预览失败");
                }
            }
        }
    }

    /**
     * 远程回放
     * @param ip
     * @param port
     * @param userName
     * @param password
     * @param channelNo
     * @param beginYear
     * @param beginMonth
     * @param beginDay
     * @param beginHour
     * @param beginMinute
     * @param beginSecond
     * @param endYear
     * @param endMonth
     * @param endDay
     * @param endHour
     * @param endMinute
     * @param endSecond
     * @param quality
     */
    public void playback(String ip, int port, String userName, String password, int channelNo,
                         int beginYear, int beginMonth, int beginDay, int beginHour, int beginMinute, int beginSecond,
                         int endYear, int endMonth, int endDay, int endHour, int endMinute, int endSecond,
                         int quality) {
        if (mLogId == 0) {  //未登录设备,先登录设备
            login(ip, port, userName, password);
        }
        if (mLogId != 0) {  //已经登录设备,下一步:远程回放
            NET_TIME beginTime = new NET_TIME();
            NET_TIME endTime = new NET_TIME();
            beginTime.dwYear = beginYear;
            beginTime.dwMonth = beginMonth;
            beginTime.dwDay = beginDay;
            beginTime.dwHour = beginHour;
            beginTime.dwMinute = beginMinute;
            beginTime.dwSecond = beginSecond;
            endTime.dwYear = endYear;
            endTime.dwMonth = endMonth;
            endTime.dwDay = endDay;
            endTime.dwHour = endHour;
            endTime.dwMinute = endMinute;
            endTime.dwSecond = endSecond;
            INetSDK.SetDeviceMode(mLogId, EM_USEDEV_MODE.SDK_RECORD_STREAM_TYPE, quality);
            TestfDataCallBack m_callback = new TestfDataCallBack();
            TestDownLoadPosCallBack posUser = new TestDownLoadPosCallBack();
            mPlaybackId = INetSDK.PlayBackByTimeEx(mLogId, channelNo, beginTime, endTime, posUser, m_callback);  //调用远程回放接口
            if (mPlaybackId != 0) {
                IPlaySDK.PLAYSetPlayedTimeEx(mPort, 0);
                IPlaySDK.PLAYResetBuffer(mPort, 1);  //清码流分析库
                IPlaySDK.PLAYResetBuffer(mPort, 3);  //清播放队列
                boolean bOpenRet = IPlaySDK.PLAYOpenStream(mPort, null, 0, 1024 * 1024 * 2) == 0 ? false : true;
                IPlaySDK.PLAYSetStreamOpenMode(mPort, Constants.STREAME_FILE);
                if (bOpenRet) {
                    boolean bPlayRet = IPlaySDK.PLAYPlay(mPort, surfaceView) == 0 ? false : true;
                    if (bPlayRet) {
                        IPlaySDK.PLAYPlaySoundShare(mPort);
                        messageFeedback(null);
                    } else {
                        IPlaySDK.PLAYCloseStream(mPort);
                        LogUtils.e(TAG, "远程回放失败,调用IPlaySDK.PLAYPlay接口失败");
                        messageFeedback("远程回放失败");
                    }
                } else {
                    LogUtils.e(TAG, "远程回放失败,调用IPlaySDK.PLAYOpenStream接口失败");
                    messageFeedback("远程回放失败");
                }
            } else {
                LogUtils.e(TAG, "远程回放失败,错误码:" + INetSDK.GetLastError());
                messageFeedback("远程回放失败");
            }
        }
    }

    /**
     * 获取录像段文件
     * @param ip
     * @param port
     * @param userName
     * @param password
     * @param channelNo
     * @param beginYear
     * @param beginMonth
     * @param beginDay
     * @param beginHour
     * @param beginMinute
     * @param beginSecond
     * @param endYear
     * @param endMonth
     * @param endDay
     * @param endHour
     * @param endMinute
     * @param endSecond
     * @return
     */
    public List<NET_RECORDFILE_INFO> getRecordFile(String ip, int port, String userName, String password, int channelNo,
                                                   int beginYear, int beginMonth, int beginDay, int beginHour, int beginMinute, int beginSecond,
                                                   int endYear, int endMonth, int endDay, int endHour, int endMinute, int endSecond) {
        List<NET_RECORDFILE_INFO> recordList = new ArrayList<NET_RECORDFILE_INFO>();
        if (mLogId == 0) {  //未登录设备,先登录设备
            login(ip, port, userName, password);
        }
        if (mLogId != 0) {
            NET_TIME beginTime = new NET_TIME();
            NET_TIME endTime = new NET_TIME();
            beginTime.dwYear = beginYear;
            beginTime.dwMonth = beginMonth;
            beginTime.dwDay = beginDay;
            beginTime.dwHour = beginHour;
            beginTime.dwMinute = beginMinute;
            beginTime.dwSecond = beginSecond;
            endTime.dwYear = endYear;
            endTime.dwMonth = endMonth;
            endTime.dwDay = endDay;
            endTime.dwHour = endHour;
            endTime.dwMinute = endMinute;
            endTime.dwSecond = endSecond;
            NET_RECORDFILE_INFO[] m_stFileInfo = new NET_RECORDFILE_INFO[100];
            for (int i = 0; i < m_stFileInfo.length; i++) {
                m_stFileInfo[i] = new NET_RECORDFILE_INFO();
            }
            Integer nFileCount = new Integer(0);
            boolean bRetQ = INetSDK.QueryRecordFile(mLogId, channelNo, 0, beginTime, endTime, "", m_stFileInfo, nFileCount, 10000, false);
            if (bRetQ && nFileCount > 0) {
                for (int i = 0; i < nFileCount; i++) {
                    recordList.add(m_stFileInfo[i]);
                }
            }
        }
        return recordList;
    }

    /**
     * 停止实时预览
     */
    public void stopLive() {
        if (mPlayId != 0) {
            IPlaySDK.PLAYStop(mPort);
            IPlaySDK.PLAYStopSoundShare(mPort);
            IPlaySDK.PLAYStopSound();
            IPlaySDK.PLAYCloseStream(mPort);
            INetSDK.StopRealPlayEx(mPlayId);
            mPlayId = 0;
            LogUtils.i(TAG, "停止实时预览成功");
        }
    }

    /**
     * 停止远程回放
     */
    public void stopPlayBack() {
        if (mPlaybackId != 0) {
            IPlaySDK.PLAYStop(mPort);
            IPlaySDK.PLAYStopSoundShare(mPort);
            IPlaySDK.PLAYStopSound();
            IPlaySDK.PLAYCloseStream(mPort);
            INetSDK.StopPlayBack(mPlaybackId);
            mPlaybackId = 0;
            LogUtils.i(TAG, "停止远程回放成功");
        }
    }

    /**
     * 登出设备
     */
    public void logout() {
        if (mLogId != 0) {
            if (INetSDK.Logout(mLogId)) {
                mLogId = 0;
                LogUtils.i(TAG, "登出设备成功");
            } else {
                LogUtils.e(TAG, "登出设备失败,错误码:" + INetSDK.GetLastError());
            }
        }
    }

    /**
     * 抓图
     * @param path
     * @return
     */
    public boolean capturePicture(String path) {
        if (mPort != 0) {
            if (IPlaySDK.PLAYCatchPicEx(mPort, path, Constants.PicFormat_BMP) != 0) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    /**
     * 暂停/播放
     * @param status  1---暂停;0---播放
     */
    public void pauseOrPlay(short status) {
        IPlaySDK.PLAYPause(mPort, status);
    }

    public class DeviceDisConnect implements CB_fDisConnect {
        @Override
        public void invoke(long lLoginID, String pchDVRIP, int nDVRPort) {
            return;
        }
    }

    public class DeviceReConnect implements CB_fHaveReConnect {
        @Override
        public void invoke(long lLoginID, String pchDVRIP, int nDVRPort) {}
    }

    public class DeviceSubDisConnect implements CB_fSubDisConnect {
        @Override
        public void invoke(int emInterfaceType, boolean bOnline, long lOperateHandle, long lLoginID) {}
    }

    public class Test_CB_fMessageCallBack implements CB_fMessageCallBack {
        @Override
        public boolean invoke(int lCommand, long lLoginID, Object obj, String pchDVRIP, int nDVRPort) {
            if (12295 == lCommand) {
                DEV_PLAY_RESULT stResult = (DEV_PLAY_RESULT) obj;
            }
            return true;
        }
    }

    public class TestRealDataCallBackEx implements CB_fRealDataCallBackEx {

        public int port;

        public TestRealDataCallBackEx(int port) {
            this.port = port;
        }

        /**
         * 网络断线回调函数
         * @param lRealHandle 实时监视ID
         * @param dwDataType  回调出来的数据类型
         * @param pBuffer     回调数据,根据数据类型的不同每次回调不同的长度的数据,除类型0,其他数据类型都是按帧,每次回调一帧数据
         * @param dwBufSize   回调数据参数结构体,根据不同的类型,参数结构也不一致
         * @param param       回调数据的长度,根据不同的类型,长度也不同(单位字节)
         */
        @Override
        public void invoke(long lRealHandle, int dwDataType, byte[] pBuffer, int dwBufSize, int param) {
            if (dwDataType == 0) {
                IPlaySDK.PLAYInputData(port, pBuffer, pBuffer.length);
            }
        }
    }

    public class TestVideoDataCallBack implements IPlaySDKCallBack.fDemuxCBFun {

        public FileOutputStream outputStream;

        public TestVideoDataCallBack(FileOutputStream outputStream) {
            this.outputStream = outputStream;
        }

        @Override
        public void invoke(int nPort, byte[] pOrgBuffer, int nOrgLen, byte[] pBuffer, int nLen,
                           IPlaySDKCallBack.DEMUX_INFO stInfo, long dwUser) {
            try {
                if (null != outputStream) {
                    outputStream.write(pBuffer);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public class TestfDataCallBack implements CB_fDataCallBack {
        @Override
        public int invoke(long lPlaybackHandle, int dwDataType, byte buffer[], int dwBufferSize) {
            if (0 == dwDataType) {
                return IPlaySDK.PLAYInputData(mPort, buffer, buffer.length);
            } else if (dwDataType == 2) {
                //m_PlayView.drawColor(pBuffer);
            } else if (dwDataType == 3) {
                //m_PlayView.drawColor(pBuffer);
            }
            return 0;
        }
    }

    public class TestDownLoadPosCallBack implements CB_fDownLoadPosCallBack {
        @Override
        public void invoke(long lPlayHandle, int dwTotalSize, int dwDownLoadSize) {
            LogUtils.i(TAG, "playback total size:" + dwTotalSize);
            if (-1 == dwDownLoadSize) {
                //m_sbPbByTime.setProgress(dwTotalSize);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        if (0 != mPlaybackId) {
                            stopPlayBack();
                        }
                    }
                }).start();
            } else {
                //m_sbPbByTime.setProgress(dwDownLoadSize);
            }
        }
    }

    private void messageFeedback(String msg) {
        Message message = Message.obtain();
        message.obj = msg;
        handler.sendMessage(message);
    }
}

这个类是已经封装好的可以直接拿去用的。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值