海康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中存储的码流数据如何转发
...全文
5410 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)

81,091

社区成员

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

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