海康威视摄像机SDK二次开发--提取音频保存至文件

6 篇文章 0 订阅

由于最近在开发海康威视摄像头,特此记录一下如何提取音频数据,这里主要依靠语音对讲返回的音频数据,通过回调函数写入文件中,加个WAV头即可播放,编码格式可以自己设置在代码中有注释
文件结构
在这里插入图片描述
其中CameraInfo内容可以参看海康威视摄像机SDK二次开发–实时预览视频流保存到指定文件中

  • HIKSDKSaveRealData中的内容
package ClientDemo;
import ClientDemo.CameraInfo;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;

import javax.swing.*;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.SimpleTimeZone;

public class HIKSDKSaveRealData {
    private static Map configParam;


    public static void main(String[] args) throws Exception {
        HIKSDKSaveRealData HikSdk = new HIKSDKSaveRealData();
        /* 此处创建对象也可以创建file对象 */
        // 创建流对象
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("F:\\debug\\hksdk\\javademo\\src\\ClientDemo\\config.txt"));
            configParam = new HashMap();
            CameraInfo cameraInfo = new CameraInfo();
            String line = null;
            int count = 0;
            while ((line = br.readLine()) != null) {
                if (line != "" && line.length() > 0 && count > 0) {
                    String[] split = line.split("\\s+");
                    configParam.put(count + "param", split);
                    count++;

                } else if (line != "" && line.length() > 0 && count == 0) {
                    String[] split = line.split("\\s+");
                    // 设置IP等参数到对象中
                    System.out.println(split[0]);
                    System.out.println(split[1]);
                    cameraInfo.setAddress(split[0]);
                    cameraInfo.setPort(Short.parseShort(split[1]));
                    cameraInfo.setUserName(split[2]);
                    cameraInfo.setPwd(split[3]);
                    count++;
                }
            }
            br.close();

            //查看当前DVR参数信息和初始化注册等 传入连接信息
//            HikSdk.getDVRConfig(cameraInfo);
            HikSdk.VoiceForward(cameraInfo);
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    /*****************************************************************
     * 语音方法
     * parameters:  cameraInfo
     * return:      null
     * ****************************************************************/
    FileWriter fLocal; //本地音频文件
    FileWriter fDevice; //设备发送的音频文件
    NativeLong nativeLong;
    HCNetSDK sdk = HCNetSDK.INSTANCE;
    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("F:\\debug\\hksdk\\javademo\\data\\local.pcm");
            fDevice = new FileWriter("F:\\debug\\hksdk\\javademo\\data\\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);
                    System.out.println('1');
                }
            } else {
                if (byAudioFlag == 1) {
                    try {
                        fDevice.write(pRecvDataBuffer);
                        fDevice.flush();
                    } catch (IOException ex) {
//                        Logger.getLogger(JDialogVoiceTalk.class.getName()).log(Level.SEVERE, null, ex);
                        System.out.println('2');
                    }
                }
            }
        }
    }

    /*****************************************************************
     * 注册设备并返回参数
     * 目的:   注册设备并返回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;
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
进行海康威视SDK二次开发的步骤如下: 1. 首先,您需要进入海康威视官网,下载最新版本的设备网络SDK。这个SDK包含了各种功能和接口,可以帮助您进行二次开发。您可以通过访问海康威视官网并在下载页面找到适合您系统的32位Windows版的SDK。 2. 下载完成后,您需要将SDK解压缩到您的开发环境中。确保您的开发环境已经配置好,并且可以访问到SDK所需的依赖库和文件。 3. 在进行SDK二次开发之前,您需要仔细阅读海康威视开发文档。这些文档会提供给您SDK的详细说明和使用方法。特别是关于SDK接口的初始化和资源释放的部分,您需要特别注意。 4. 在开始编写代码之前,您可以先确定您的项目需求和目标。根据您的需求,选择适合的SDK接口进行开发。您可以使用SDK提供的各种功能,如视频流获取、图像处理、设备控制等。 5. 在编写代码时,您需要按照SDK文档提供的接口说明来调用相应的函数。在调用SDK接口之前,您需要进行初始化操作,以确保SDK能够正常工作。在完成操作之后,记得释放SDK所占用的资源,以免造成内存泄漏或其他问题。 6. 在开发过程中,您可能会遇到一些问题或困惑。您可以参考海康威视官方网站提供的开发者社区或技术支持渠道,寻求帮助和解答。 总结起来,进行海康威视SDK二次开发的关键步骤包括下载最新版本的设备网络SDK,阅读开发文档并了解SDK的初始化和资源释放操作,根据项目需求选择适合的功能和接口进行开发,编写代码并调用SDK接口,最后注意释放SDK所占用的资源。希望这些步骤能够帮助您进行海康威视SDK二次开发。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [基于海康威视SDK实现二次开发](https://blog.csdn.net/weixin_44738214/article/details/126168881)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [海康威视sdk二次开发包.zip](https://download.csdn.net/download/weixin_43297335/12288413)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值