导读
由于本人最近在开发大华摄像机,特此分享一些经验给到各位开发朋友,本次实例是关于大华摄像机的实时预览视频码流保存到文件中的Demo,本人还开发过海康威斯的SDK,如果有需要的话看我前几篇文章下面附上链接,有问题留言看到一定会回复
以下为作者原创,如转载请告知,如不告知侵权必究
海康威视IPC二次开发SDK提取音频数据部分代码:https://blog.csdn.net/weixin_44232093/article/details/99406803
海康威视SDK二次开发通过云台参数设置控制摄像机的位置:https://blog.csdn.net/weixin_44232093/article/details/97649823
Java海康威视摄像头实时预览视频流保存到指定文件中:
https://blog.csdn.net/weixin_44232093/article/details/96429942
1.开发环境
package main.java.com.netsdk.demo.frame;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import main.java.com.netsdk.common.Res;
import main.java.com.netsdk.demo.module.LoginModule;
import main.java.com.netsdk.lib.NetSDKLib;
import main.java.com.netsdk.lib.ToolKits;
import javax.swing.*;
public class DaHuaCameraRealPlay {
// 界面窗口
private static JFrame frame = new JFrame();
// 获取sdk实例
public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
// 设备信息
public static NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
// 登陆句柄
public static NetSDKLib.LLong m_hLoginHandle = new NetSDKLib.LLong(0);
/*
* 初始化设备
* 登录设备
* */
public void startRealPlay(){
// 登录
DisConnect dis = new DisConnect();
// 调用INit初始化, 登录设备
LoginModule.init(dis, null);
// 换成自己的设备信息即可 默认端口号37777
login("192.168.1.XXX",37777 ,"用户名" ,"密码" );
RealPlayByDataType();
}
public void RealPlayByDataType() {
// 创建Stin对象 设置码流格式 通道号 预览类型 用户数据 保存文件名称
NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE();
stIn.emDataType = NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS;
stIn.nChannelID = 0;
stIn.rType = NetSDKLib.NET_RealPlayType.NET_RType_Realplay;
stIn.dwUser = null;
stIn.szSaveFileName = "D:\\DahuaResult\\result.flv"; // 转换后的裸H264码流文件名
// 创建Stout对象
NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE();
// 预览转码流保存
NetSDKLib.LLong lRealHandle = netsdk.CLIENT_RealPlayByDataType(m_hLoginHandle, stIn, stOut, 5000);
if(lRealHandle.longValue() != 0) {
System.out.println("RealPlayByDataType Succeed!");
} else {
System.err.printf("RealPlayByDataType Failed!Last Error[0x%x]\n", netsdk.CLIENT_GetLastError());
return;
}
try {
// 录像时间 单位毫秒
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 停止预览
netsdk.CLIENT_StopRealPlay(lRealHandle); // 必须停止拉流后,才会生成文件
}
public static boolean login(String m_strIp, int m_nPort, String m_strUser, String m_strPassword) {
IntByReference nError = new IntByReference(0);
m_hLoginHandle = netsdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword, 0, null, m_stDeviceInfo, nError);
if(m_hLoginHandle.longValue() == 0) {
System.err.printf("Login Device[%s] Port[%d]Failed. %s\n", m_strIp, m_nPort, ToolKits.getErrorCodePrint());
} else {
System.out.println("Login Success [ " + m_strIp + " ]");
}
return m_hLoginHandle.longValue() == 0? false:true;
}
/*
* 断线提示参数
* */
private static class DisConnect implements NetSDKLib.fDisConnect {
public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort);
// 断线提示
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.setTitle(Res.string().getRealplay() + " : " + Res.string().getDisConnectReconnecting());
}
});
}
}
public static void main(String[] args) {
DaHuaCameraRealPlay daHuaCamera = new DaHuaCameraRealPlay();
daHuaCamera.startRealPlay();
}
}
如有问题请留言,看到必定回复,欢迎大家一起讨论,如有不足请指出