海康威视IPC二次开发SDK提取音频数据部分代码

海康威视IPC二次开发SDK提取音频数据部分代码

由于最近在开发海康威视摄像头,特此记录一下如何提取音频数据,这里主要依靠语音对讲返回的音频数据,通过回调函数写入文件中,加个WAV头即可播放,编码格式可以自己设置在代码中有注释

注:本文为博主原创文章,未经博主允许不得转载。 如需转载请注明出处,否则必定追究法律责任


 /*****************************************************************
    * 语音方法
     * parameters:  cameraInfo
     * return:      null
    * ****************************************************************/
    FileWriter fLocal ; //本地音频文件
    FileWriter fDevice; //设备发送的音频文件
    NativeLong nativeLong;
    void VoiceForward(CameraInfo cameraInfo){
        CameraInfo parameter = getParameter(cameraInfo);
        //判断是否注册成功
        if(parameter.getUserId().intValue()<0){
            System.out.println("注册设备失败 错误码为: " +sdk.NET_DVR_GetLastError());
        }else {
            System.out.println("注册成功  Id为:      "+ cameraInfo.getUserId().intValue());
        }

        //判断是否获取到设备能力
        HCNetSDK.NET_DVR_WORKSTATE_V30 devWork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
        if(!sdk.NET_DVR_GetDVRWorkState_V30(cameraInfo.getUserId(), devWork)){
            System.out.println("获取设备能力集失败,返回设备状态失败...............");
            return;
        }

        try {

            /*
            * 设置语音对象的编码类型
            * 编码类型:     G711
            * 音频数据采样率:  16000
            * 格式:       16位采样并且单通道
            * */

            HCNetSDK.NET_DVR_COMPRESSION_AUDIO audio = new HCNetSDK.NET_DVR_COMPRESSION_AUDIO();
            audio.byAudioEncType=1;


            fLocal = new FileWriter("D:\\realData\\local.pcm");
            fDevice = new FileWriter("D:\\realData\\device.pcm");
            FVoiceDataCallBack fVoiceDataCallBack = new FVoiceDataCallBack();
            JComboBox jComboBoxDataType = new javax.swing.JComboBox();
             nativeLong = sdk.NET_DVR_StartVoiceCom_V30(cameraInfo.getUserId(), 0, jComboBoxDataType.getSelectedIndex() == 2, fVoiceDataCallBack, null);
            if(nativeLong.intValue()==-1){
                System.out.println(111);
            }
            try {
                Thread.sleep(20000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            sdk.NET_DVR_StopVoiceCom(nativeLong);
            sdk.NET_DVR_Logout(nativeLong);
            sdk.NET_DVR_Cleanup();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
		/*
		*语音对讲回调函数
		*/
 class FVoiceDataCallBack implements HCNetSDK.FVoiceDataCallBack_V30
    {
        //对对讲的音频数据进行回调操作,以下写入文件操作
        public void invoke(NativeLong lVoiceComHandle, String pRecvDataBuffer, int dwBufSize, byte byAudioFlag, Pointer pUser)
        {
            //byAudioFlag为0表示本地文件,为1表示设备的音频文件
            if (byAudioFlag == 0)
            {
                try
                {
                    fLocal.write(pRecvDataBuffer);
                    fLocal.flush();
                } catch (IOException ex)
                {
                    Logger.getLogger(JDialogVoiceTalk.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else
            {
                if (byAudioFlag == 1)
                {
                    try
                    {
                        fDevice.write(pRecvDataBuffer);
                        fDevice.flush();
                    } catch (IOException ex)
                    {
                        Logger.getLogger(JDialogVoiceTalk.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        }
    }
/*****************************************************************
     * 注册设备并返回参数
    * 目的:   注册设备并返回key    :Nativelong
    * parameters:    cameraInfo
     *return:        cameraInfo
    * ****************************************************************/
    private CameraInfo getParameter(CameraInfo cameraInfo){
        //设置设备通道号   查看Demo代码  通道号为1
        NativeLong channel = new NativeLong(1);
        cameraInfo.setChannel(channel);
        if (!sdk.NET_DVR_Init()) {
            System.out.println("初始化失败..................");
        }

        //创建设备
        HCNetSDK.NET_DVR_DEVICEINFO_V30 deInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();

        //注册用户设备
        NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getAddress(), cameraInfo.getPort(),
                cameraInfo.getUserName(), cameraInfo.getPwd(), deInfo);
        cameraInfo.setUserId(id);
        return cameraInfo;
    }

以上代码可根据自己的需求修改,cameraInfo对象在我的这篇文章中
https://blog.csdn.net/weixin_44232093/article/details/96429942

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我三胖哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值