海康二次开发SDK实时视频流预览以及保存以及海康视频的转码

写这篇文章之前非常感谢博主 叫我三胖哥哥,我的代码是在他的基础上写的,https://blog.csdn.net/weixin_44232093  这是他的博客,可以去看看。

首先进行海康二次开发需要,在海康官网去下载SDk,下载地址是https://www.hikvision.com/cn/download_more_570.html

将下载好的SDK导入到工具中,我的是eclipse里面,如下图

你可以试运行这个demo,直接运行ClientDemo类就行了

首先,一定要保证这个demo能运行起来

然后自己再根据demo写个类进行测试预览跟实时流获取视频的问题。

package ClientDemo;

import java.awt.Frame;
import java.awt.Panel;

import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.examples.win32.W32API.HWND;
import com.sun.jna.ptr.ByteByReference;

import ClientDemo.HCNetSDK.FStdDataCallBack;

public class AJB extends Frame
{
    private static final long serialVersionUID = 1L;
    
    public AJB(String str)
    {
        super(str);
    }

    public static void main(String args[])
    {
        AJB fr = new AJB("海康实时预览");
        Panel pan = new Panel();
        fr.setSize(400, 400);
        // fr.setBackground(Color.blue);
        pan.setSize(100, 100);
        // pan.setBackground(Color.yellow);
        fr.add(pan);
        fr.setVisible(true);

        CameraInfo cameraInfo = new CameraInfo();
//        cameraInfo.setAddress("192.168.99.8");
        cameraInfo.setAddress("192.168.99.20");
        cameraInfo.setPort((short) 8000);
        cameraInfo.setUserName("admin");
//        cameraInfo.setPwd("zmkj1234");
        cameraInfo.setPwd("admin12345");

        System.out.println(pan.getWidth());
        System.out.println(pan.getHeight());

        // 设置设备通道号 查看Demo代码 通道号为1
        NativeLong channel = new NativeLong(1);
        cameraInfo.setChannel(channel);
        // 初始化HCNetSDK接口 实例化对象
        HCNetSDK sdk = HCNetSDK.INSTANCE;
        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);

        // 判断是否注册成功
        if (cameraInfo.getUserId().intValue() < 0)
        {
            System.out.println("注册设备失败");
        }

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

        // 启动实时预览功能 创建clientInfo对象赋值预览参数

        HCNetSDK.NET_DVR_CLIENTINFO clientInfo = new HCNetSDK.NET_DVR_CLIENTINFO();

        clientInfo.lChannel = cameraInfo.getChannel(); // 设置通道号
        clientInfo.lLinkMode = new NativeLong(0); // TCP取流
        clientInfo.sMultiCastIP = null; // 不启动多播模式

        // 创建窗口句柄
        HWND hwnd = new HWND(Native.getComponentPointer(pan));

        clientInfo.hPlayWnd = hwnd;
        ClientDemo clientDemo = new ClientDemo();
        ClientDemo.FRealDataCallBack fRealDataCallBack = clientDemo.fRealDataCallBack;
//        System.out.println("fRealDataCallBack:" + fRealDataCallBack);

        // 开启实时预览
        NativeLong key = sdk.NET_DVR_RealPlay_V30(cameraInfo.getUserId(), clientInfo, fRealDataCallBack, null, true);

        // 判断是否预览成功
        if (key.intValue() == -1)
        {
            System.out.println("预览失败   错误代码为:  " + sdk.NET_DVR_GetLastError());
            sdk.NET_DVR_Logout(cameraInfo.getUserId());
            sdk.NET_DVR_Cleanup();
        }

        boolean 成功1 = sdk.NET_DVR_SetRealDataCallBack(id, fRealDataCallBack, 0);
        System.out.println("成功1:" + 成功1);

        FStdDataCallBack fs = new FStdDataCallBack()
            {
                @Override
                public void invoke(NativeLong lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize,
                        int dwUser)
                {
                    
                }
            };

        boolean 成功2 = sdk.NET_DVR_SetStandardDataCallBack(id, fs, 0);
        System.out.println("成功2:" + 成功2);
        
        boolean 保存 = sdk.NET_DVR_SaveRealData(key, "E:\\video.mp4");
        System.out.println("保存:" + 保存);
        if (!保存)
        {
            System.out.println("错误码:" + sdk.NET_DVR_GetLastError());
        }
        
        try
        {
            Thread.sleep(5000);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        
        boolean 停止 = sdk.NET_DVR_StopRealPlay(key);
        System.out.println("停止:" + 停止);

    }

}

这段代码还带有个实体类,如下
 

package ClientDemo;

import com.sun.jna.NativeLong;

public class CameraInfo
{
      private String address;
    private String userName;
    private String pwd;
    private short port;
    private NativeLong userId;
    private NativeLong channel;
    private NativeLong key;
    
    public String getAddress()
    {
        return address;
    }
    public void setAddress(String address)
    {
        this.address = address;
    }
    public String getUserName()
    {
        return userName;
    }
    public void setUserName(String userName)
    {
        this.userName = userName;
    }
    public String getPwd()
    {
        return pwd;
    }
    public void setPwd(String pwd)
    {
        this.pwd = pwd;
    }
    public short getPort()
    {
        return port;
    }
    public void setPort(short port)
    {
        this.port = port;
    }
    public NativeLong getUserId()
    {
        return userId;
    }
    public void setUserId(NativeLong userId)
    {
        this.userId = userId;
    }
    public NativeLong getChannel()
    {
        return channel;
    }
    public void setChannel(NativeLong channel)
    {
        this.channel = channel;
    }
    public NativeLong getKey()
    {
        return key;
    }
    public void setKey(NativeLong key)
    {
        this.key = key;
    }
    
    // get set方法
    

}

 

这样就能获取到海康视频了,不过海康视频是一般播放器打不开的,可以使用VLC打开,所以如果公用还是需要转码。

不知道其他人是怎么转码的,我用的是FFmpeg进行转码,关于FFmpeg怎么转码,网上有很多实例,我就不多说了,一个cmd命令就搞定
 

 

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: SDL (Simple DirectMedia Layer) 是一个跨平台的多媒体库,用于处理音频、视频、图形以及用户输入。而海康SDK是指海康威视提供的用于监控设备的软件开发工具包。 使用SDL 2.0播放海康SDK提供的视频流,需要以下几个步骤: 1. 初始化SDL:在程序开始时,调用SDL_Init()函数进行SDL的初始化。 2. 创建窗口:调用SDL_CreateWindow()函数创建一个窗口用于显示视频流。 3. 创建渲染器:调用SDL_CreateRenderer()函数创建一个渲染器,将其与窗口关联。 4. 打开视频流:使用海康SDK提供的接口打开视频流,并获取视频流的相关信息。 5. 创建纹理:调用SDL_CreateTexture()函数创建一个纹理对象,用于将视频流数据渲染到窗口上。 6. 渲染视频帧:通过不断循环,在每一帧中,将视频流数据解码为图像帧,并将其更新到纹理对象中。 7. 渲染纹理到窗口:调用SDL_RenderCopy()函数将纹理渲染到窗口上。 8. 刷新窗口:调用SDL_RenderPresent()函数将窗口上的渲染结果显示出来。 9. 释放资源:在程序结束时,调用SDL_DestroyTexture、SDL_DestroyRenderer和SDL_DestroyWindow函数释放已创建的资源。 通过以上步骤,可以将海康SDK提供的视频流使用SDL 2.0库进行播放。当然,为了实现更加复杂的功能,可能还需要使用到其他的SDL函数和海康SDK的接口,具体根据实际需求来选择使用。 ### 回答2: SDL(Simple DirectMedia Layer)是一个跨平台的开源多媒体库,它提供了音频、视频、图形和事件处理等功能,并且非常易于使用。海康SDK(Software Development Kit)则是海康威视的开发工具包,提供了与海康设备进行通信和交互的功能。下面是使用SDL 2.0和海康SDK播放视频流的简要步骤。 1. 配置SDL环境:在SDL官方网站上下载并安装最新版本的SDL 2.0库,然后在项目中引用SDL的头文件和库文件。 2. 初始化SDL:在程序中调用SDL_Init()函数初始化SDL库,并检查是否成功初始化。 3. 创建窗口和渲染器:使用SDL_CreateWindow()函数创建一个窗口对象,并使用SDL_CreateRenderer()函数创建一个渲染器对象。 4. 初始化海康SDK:在程序中调用海康SDK提供的初始化函数,确保海康设备和SDK的连接正常。 5. 打开视频流:使用海康SDK提供的函数打开视频流,并获取视频流的句柄。 6. 播放视频流:使用SDL提供的函数循环从视频流中读取数据,并使用SDL_RenderPresent()函数将数据渲染到窗口上显示。 7. 释放资源:在程序结束前,调用SDL_DestroyRenderer()、SDL_DestroyWindow()、SDL_Quit()等函数释放创建的SDL相关资源,并调用海康SDK提供的函数关闭视频流连接。 需要注意的是,在具体的代码实现中,还需要处理SDL事件、设置渲染器的尺寸和位置、配置海康设备的IP地址和登录信息等额外的步骤。 综上所述,使用SDL 2.0和海康SDK播放视频流的过程包括配置SDL环境、初始化SDL、创建窗口和渲染器、初始化海康SDK、打开视频流、播放视频流、释放资源等步骤。这样我们就可以通过SDL来实现简单地播放海康设备的视频流。 ### 回答3: SDL(Simple DirectMedia Layer)是一款开源跨平台的多媒体库,可用于软件开发中处理音频、图形、视频等多媒体元素。而海康SDK则是海康威视公司提供的一套用于实现视频监控系统的开发工具包。 要使用SDL2.0播放海康SDK提供的视频流,首先需要导入SDL2.0相关的开发库和头文件,并进行相应的配置。然后,可以通过与海康SDK进行通信,获取视频流数据,并使用SDL2.0进行解码和播放。 具体步骤如下: 1. 导入SDL2.0开发库和头文件至项目中。 2. 进行SDL2.0的初始化操作,包括初始化视频子系统、创建窗口和渲染器等。 3. 通过海康SDK的接口获取视频流数据,并将数据传递给SDL2.0进行解码和渲染。 4. 在主循环中,使用SDL2.0提供的函数进行视频的播放和显示。 5. 在程序结束时,进行资源的释放,包括停止视频播放、销毁窗口和渲染器,最后关闭SDL2.0。 需要注意的是,具体的代码实现可能因开发环境、操作系统和海康SDK版本的不同而有所差异。在实际开发中,可以参考SDL2.0和海康SDK的官方文档和示例代码,以了解更详细的操作步骤和调用方法。 总之,通过整合SDL2.0和海康SDK,可以方便地实现对海康视频流的播放。这样的应用可在视频监控系统、安防领域等多个领域中发挥重要作用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值