海康SDK 回调函数中取到的码流数据如何转发至前台页面播放

我持浮生祭奠流年 2017-04-20 09:40:15
回调函数如下:

class FRealDataCallBack implements HCNetSDK.FRealDataCallBack_V30
{
//预览回调
public void invoke(NativeLong lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser)
{
HWND hwnd =hwand;
switch (dwDataType)
{
case HCNetSDK.NET_DVR_SYSHEAD: //系统头

if (!playControl.PlayM4_GetPort(m_lPort)) //获取播放库未使用的通道号
{
break;
}

if (dwBufSize > 0)
{
if (!playControl.PlayM4_SetStreamOpenMode(m_lPort.getValue(), PlayCtrl.STREAME_REALTIME)) //设置实时流播放模式
{
break;
}

if (!playControl.PlayM4_OpenStream(m_lPort.getValue(), pBuffer, dwBufSize, 1024 * 1024)) //打开流接口
{
break;
}

if (!playControl.PlayM4_Play(m_lPort.getValue(), hwnd)) //播放开始
{
break;
}
}
case HCNetSDK.NET_DVR_STREAMDATA: //码流数据
if ((dwBufSize > 0) && (m_lPort.getValue().intValue() != -1))
{
if (!playControl.PlayM4_InputData(m_lPort.getValue(), pBuffer, dwBufSize)) //输入流数据
{
break;
}
}
}
}

pBuffer中存储的码流数据如何转发
...全文
5430 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35171751 2021-01-13
  • 打赏
  • 举报
回复
调用其他接口没问题,调用实时码流接口时报错: Error looking up function 'NET_DVR_SetStandardDataCallback': ÕҲ»µ½ָ¶¨µ 什么问题呢?怎么解决?
铁憨憨b 2019-11-18
  • 打赏
  • 举报
回复
您好,你这个解决了吗?是先保存,再自己推流出去吗?你这个跟我的一模一样,应该是车载的demo。现在我也要做个实时监控,但是开康demo里只能获取到实时的码流数据。我能想到就是先存起来在转发推流成ffmpeg的方式。您是怎么解决的呢
Leason_lee 2019-07-09
  • 打赏
  • 举报
回复
引用 33 楼 寻找幸福の佳佳酱 的回复:
[quote=引用 32 楼 LinyangMeng 的回复:]
[quote=引用 31 楼 寻找幸福の佳佳酱 的回复:]
谢谢,解决了,我用了最新的sdk,就可以了

方便问下 如何解决的么 最近刚好在弄[/quote]
我要先说一下的就是,我之前写错了

客户端通过注册设备(NET_DVR_Login_V30)返回的设备信息NET_DVR_DEVICEINFO_V30获取模拟通道个数(byChanNum)为0

我的解决方法是,去海康的官网下载了一个最新的windows的64位的sdk
然后把对应的旧版本的库文件都替换了
然后写对端口(不是http端口),ip,用户名和密码就解决了。[/quote]可以发一下demo吗?折磨很久了,谢谢!447021667@qq.com
  • 打赏
  • 举报
回复
引用 32 楼 LinyangMeng 的回复:
[quote=引用 31 楼 寻找幸福の佳佳酱 的回复:] 谢谢,解决了,我用了最新的sdk,就可以了
方便问下 如何解决的么 最近刚好在弄[/quote] 我要先说一下的就是,我之前写错了 是 客户端通过注册设备(NET_DVR_Login_V30)返回的设备信息NET_DVR_DEVICEINFO_V30获取模拟通道个数(byChanNum)为0 我的解决方法是,去海康的官网下载了一个最新的windows的64位的sdk 然后把对应的旧版本的库文件都替换了 然后写对端口(不是http端口),ip,用户名和密码就解决了。
LinY_X 2019-05-17
  • 打赏
  • 举报
回复
引用 31 楼 寻找幸福の佳佳酱 的回复:
谢谢,解决了,我用了最新的sdk,就可以了

方便问下 如何解决的么 最近刚好在弄
  • 打赏
  • 举报
回复
谢谢,解决了,我用了最新的sdk,就可以了
  • 打赏
  • 举报
回复
引用 29 楼 寻找幸福の佳佳酱 的回复:
我想问一下,客户端通过注册设备(NET_DVR_Login_V40)返回的设备信息NET_DVR_DEVICEINFO_V30获取模拟通道个数(byChanNum)为0怎么回事呀
没有取到或则设备配置上没有开放 有点久了忘记了 不过之前遇到过
  • 打赏
  • 举报
回复
我想问一下,客户端通过注册设备(NET_DVR_Login_V40)返回的设备信息NET_DVR_DEVICEINFO_V30获取模拟通道个数(byChanNum)为0怎么回事呀
  • 打赏
  • 举报
回复
使用FFk可以推流 然后用Red5 能送到页面
dray_ 2019-04-01
  • 打赏
  • 举报
回复
兄弟,首先你需要海康的浏览器控件
qq850256507 2019-03-28
  • 打赏
  • 举报
回复
引用 25 楼 callme_wuxu 的回复:
楼主预览回调的数据能转发出去了吗?比如用librtmp 推到 到rtmp上,行得通吗
同问!!
callme_wuxu 2019-03-16
  • 打赏
  • 举报
回复
楼主预览回调的数据能转发出去了吗?比如用librtmp 推到 到rtmp上,行得通吗
qq_15534145 2018-10-11
  • 打赏
  • 举报
回复
现在我调用回调,总提示我不支持的参数
m_lPlayHandle = hCNetSDK.NET_DVR_PlayBackByTime(lUserID, lChannel, lpStartTime, lpStopTime, hWnd);
if (m_lPlayHandle.intValue() == -1){
int errorCode = hCNetSDK.NET_DVR_GetLastError();
System.out.println("按时间回放失败-errorCode:"+ errorCode);
return false;
}else{
hCNetSDK.NET_DVR_SetPlayDataCallBack(m_lPlayHandle,new PlayDataCallBack(hCNetSDK,pushKey),0);
if(hCNetSDK.NET_DVR_PlayBackControl(m_lPlayHandle, HCNetSDK.NET_DVR_PLAYSTART, 0, null)){
System.out.println("回放开始");
}

}


PlayDataCallBack是我定义的回调方法,实现了HCNetSDK.FPlayDataCallBack
调用的时候总提示PlayDataCallBack不支持的参数类型,请问您有碰到过这个问题吗
  • 打赏
  • 举报
回复
引用 19 楼 qq_24991697 的回复:
class NVRCallbackHardware implements HCNetSDK.FPlayDataCallBack
{


private OutputStream out;
private HCNetInter hcNetInter;
private NativeLong lPlayHandle;
private boolean loading = false;







public NVRCallbackHardware(HCNetInter hcNetInter,NativeLong lPlayHandle,HttpServletResponse response){
this.hcNetInter = hcNetInter;
this.lPlayHandle = lPlayHandle;
try {
out = response.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
}

//预览回调
public void invoke(NativeLong lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser)
{


/**
* 让 loading 一直保持 为true
* 说明 还有码流数据 在回传
*/
loading = true;

Pointer pointer = null;
switch (dwDataType)
{
case HCNetSDK.NET_DVR_STREAMDATA: //码流数据
if (dwBufSize > 0) {
pointer = pBuffer.getPointer();
try {
if (pointer != null && out != null) {
try {
out.write(pointer.getByteArray(0, dwBufSize));
out.flush();
} catch (NullPointerException e) {
loading = false;
e.printStackTrace();
hcNetInter.NET_DVR_StopPlayBack(lPlayHandle);
out.close();
System.out.println("关闭连接");
return;
}
}
} catch (Exception e) {
loading = false;
hcNetInter.NET_DVR_StopPlayBack(lPlayHandle);
e.printStackTrace();
}
}
break;

case HCNetSDK.NET_DVR_AUDIOSTREAMDATA: //码流数据
if (dwBufSize > 0) {
pointer = pBuffer.getPointer();
try {
if (pointer != null && out != null) {
try {
out.write(pointer.getByteArray(0, dwBufSize));
out.flush();
} catch (NullPointerException e) {
loading = false;
e.printStackTrace();
hcNetInter.NET_DVR_StopPlayBack(lPlayHandle);
out.close();
System.out.println("关闭连接");
return;
}
}
} catch (Exception e) {
loading = false;
hcNetInter.NET_DVR_StopPlayBack(lPlayHandle);
e.printStackTrace();
}
}
break;



case HCNetSDK.NET_DVR_REALPLAYEXCEPTION: //预览异常
loading = false;
break;
case HCNetSDK.NET_DVR_REALPLAYNETCLOSE: //预览时连接断开
loading = false;
break;
case HCNetSDK.NET_DVR_REALPLAY5SNODATA: //预览5s没有收到数据
loading = false;
break;
case HCNetSDK.NET_DVR_PLAYBACKEXCEPTION: //回放异常
loading = false;
break;
case HCNetSDK.NET_DVR_PLAYBACKNETCLOSE: //回放时候连接断开
loading = false;
break;
case HCNetSDK.NET_DVR_PLAYBACK5SNODATA: //回放5s没有收到数据
loading = false;
break;
}
}


public boolean isLoading() {
return loading;
}

public void setLoading(boolean loading) {
this.loading = loading;
}
}


之前的项目流产了,但是貌似这个是可以用的,过了这么久还是来结贴一下,以后有人搞的话可以做个参考
WillPower_JFL 2018-02-01
  • 打赏
  • 举报
回复
引用 20 楼 maben1008 的回复:
把回调的码流,按udp 发送到前端; 用海康的播放库,直接播放收到的udp码流就可以;
最近也在海康SDK,完全是懵逼的...可以咨询一下你吗
WillPower_JFL 2018-02-01
  • 打赏
  • 举报
回复
引用 7 楼 u010223407 的回复:
我们是通过前台js来显示摄像头画面的
怎么处理显示的呀
初晨_NAN 2018-01-02
  • 打赏
  • 举报
回复
把回调的码流,按udp 发送到前端; 用海康的播放库,直接播放收到的udp码流就可以;
jackoak 2017-12-17
  • 打赏
  • 举报
回复
class NVRCallbackHardware implements HCNetSDK.FPlayDataCallBack { private OutputStream out; private HCNetInter hcNetInter; private NativeLong lPlayHandle; private boolean loading = false; public NVRCallbackHardware(HCNetInter hcNetInter,NativeLong lPlayHandle,HttpServletResponse response){ this.hcNetInter = hcNetInter; this.lPlayHandle = lPlayHandle; try { out = response.getOutputStream(); } catch (IOException e) { e.printStackTrace(); } } //预览回调 public void invoke(NativeLong lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser) { /** * 让 loading 一直保持 为true * 说明 还有码流数据 在回传 */ loading = true; Pointer pointer = null; switch (dwDataType) { case HCNetSDK.NET_DVR_STREAMDATA: //码流数据 if (dwBufSize > 0) { pointer = pBuffer.getPointer(); try { if (pointer != null && out != null) { try { out.write(pointer.getByteArray(0, dwBufSize)); out.flush(); } catch (NullPointerException e) { loading = false; e.printStackTrace(); hcNetInter.NET_DVR_StopPlayBack(lPlayHandle); out.close(); System.out.println("关闭连接"); return; } } } catch (Exception e) { loading = false; hcNetInter.NET_DVR_StopPlayBack(lPlayHandle); e.printStackTrace(); } } break; case HCNetSDK.NET_DVR_AUDIOSTREAMDATA: //码流数据 if (dwBufSize > 0) { pointer = pBuffer.getPointer(); try { if (pointer != null && out != null) { try { out.write(pointer.getByteArray(0, dwBufSize)); out.flush(); } catch (NullPointerException e) { loading = false; e.printStackTrace(); hcNetInter.NET_DVR_StopPlayBack(lPlayHandle); out.close(); System.out.println("关闭连接"); return; } } } catch (Exception e) { loading = false; hcNetInter.NET_DVR_StopPlayBack(lPlayHandle); e.printStackTrace(); } } break; case HCNetSDK.NET_DVR_REALPLAYEXCEPTION: //预览异常 loading = false; break; case HCNetSDK.NET_DVR_REALPLAYNETCLOSE: //预览时连接断开 loading = false; break; case HCNetSDK.NET_DVR_REALPLAY5SNODATA: //预览5s没有收到数据 loading = false; break; case HCNetSDK.NET_DVR_PLAYBACKEXCEPTION: //回放异常 loading = false; break; case HCNetSDK.NET_DVR_PLAYBACKNETCLOSE: //回放时候连接断开 loading = false; break; case HCNetSDK.NET_DVR_PLAYBACK5SNODATA: //回放5s没有收到数据 loading = false; break; } } public boolean isLoading() { return loading; } public void setLoading(boolean loading) { this.loading = loading; } }
xxxlty 2017-09-18
  • 打赏
  • 举报
回复
引用 15 楼 qq_24991697 的回复:
我做过,不过我现在躺床上,如果明天记得住,我就上传代码。不过,这里可以说一下的是,可以用for循环,不断偏移,从bytereference中读出来。要理解码流,码流码流,其实就是byte数组嘛,得到数组了,其实数组里面的二进制数据就得到了。还有就是,java访问硬件,本质上是通过java虚拟机访问的,虚拟机调用c或c++写的dll,传参给c代码,参数是地址。还有就是,jni或jna为什么要继承特定的接口,其实实现接口的目的就是给这个接口加一个标签,java虚拟机的类加载器在加载这个类的class文件后,发现它的这个jni接口标签,就知道,哦,这个是个调dll的接口,他没有实现类,他是直接通过参数地址来干活的
亲,呼叫啊~~~
xxxlty 2017-09-18
  • 打赏
  • 举报
回复
有流程吗,急需啊,刚接受海康摄像头的活
加载更多回复(16)
系统功能1、管理员管理:根据不同角色设置不同的管理权限;2、小区管理,管理多个小区资料,新增、修改、删除、摄像头管理等功能;3、小区摄像头管理:摄像头的新增、修改及删除功能;4、居民管理:居民资料新增,修改,删除,Excel批量导入,导出,居民人脸采集;5、访客登记:访客的新增,修改,删除,进入登记,离开登记,查询等功能;6、人脸识别:居民出入小区人脸识别功能的实现,使用腾讯AI人脸识别技术实现;7、出入记录:居民出入小区的人脸识别记录查询;8、小区地图:所有小区在地图的分布情况,使用百度地图实现;9、使用Echarts技术实现小区人员分类统计(柱状)图表;10、菜单管理:新增、修改、删除菜单功能(包括目录,菜单,按钮)11、角色管理:新增、修改、删除角色(系统角色、普通角色)12、系统日志:记录了系统中所有操作的日志,方便发现问题,查找原因;运行环境:  1、JDK1.8及以上版本  2、Tomcat 8.5及以上版本  3、MySql 5.7及以上版本  4、Redis开发工具:  1、前端开发工具:Visual Studio Code  2、后端开发工具:Intellij IDEA使用技术:  1、Vue2.x+ElementUI(前端)  2、Springboot+MyBatisPlus+Redis+Shiro+Swagger(后端)  3、人脸识别技术(腾讯AI)  4、MySql数据库技术  5、Redis缓存技术  6、百度地图  7、Echarts图表技术  8、POI Excel导入导出技术  9、Shiro权限控制:菜单管理,角色管理,权限管理(按钮及用户级别权限)  10、 Swagger接口配置管理,接口文档管理技术  11、Token单点技术(一个用户不能同时在多个设备登录使用)  12、前后端分离跨域设置等技术

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧