做过海康二次开发的进,求预览回调的实现思路

时间:2022-08-28 03:26:46
这个项目是基于海康DVR或者视频采集卡的SDK完成的
我现在已经实现了基本的录像、预览、抓图等功能,目前我想做的是,在预览开启之前,对图像进行一些处理后再预览出来。比如说在预览画面上增加一个矩形框等

没有做过关于视频流的分析,我的想法是,有没有办法可以对视频流进行分解,PAL的摄像头好像是每秒25帧,是不是可以转化为25副图片?我在部分图片上进行处理(增加矩形),处理完毕以后再在实时预览中显示出来。

这样是否可以呢?
还有就是回调函数是什么意思呢?是不是就是说,我这里处理完毕后再回传回去以后,再让视频显示出来?

主要真心对视频流不了解,希望大家给点思路.

这个项目的最终目的是,我想对视频流中的图像每一秒截取部分帧(一秒有30帧,我可能就需要2帧就好)转化为BMP图片,然后对这个图片进行处理,有矩形框标记的图片转存下来,留待以后分析

求思路,如果有做过的案例,更好,谢谢

13 个解决方案

#1


调用NET_DVR_RigisterDrawFun试试

NET_DVR_RigisterDrawFun
预览画面叠加字符和图像,Linux下无此接口。

BOOL NET_DVR_RigisterDrawFun(
  LONG        lRealHandle,
  fDrawFun    cbDrawFun,
  DWORD       dwUser
);
Parameters
lRealHandle 
[in] NET_DVR_RealPlay或NET_DVR_RealPlay_V30的返回值 
cbDrawFun 
[in] 画图回调函数 
dwUser 
[in] 用户数据 
Callback Function
typedef void(CALLBACK *fDrawFun)(
  LONG      lRealHandle,
  HDC       hDc,
  DWORD     dwUser
);
Callback Function Parameters
lRealHandle 
[out] 当前的预览句柄 
hDc 
[out] 画图DC 
dwUser 
[out] 用户数据 
Return Values
TRUE表示成功,FALSE表示失败。获取错误码调用NET_DVR_GetLastError

Remarks
该接口主要完成注册回调函数,获得当前表面的device context。用户可以在这个DC上画图或写字,就好像在窗口的客户区DC上绘图,但这个DC不是窗口客户区的DC,而是播放器DirectDraw里的Off-Screen表面的DC。 

如果调用接口NET_DVR_RealPlay_V30进行预览,参数bBlocked建议置1(TRUE),这样预览接口返回成功即可该调用该接口。如果参数bBlocked置0,预览接口返回成功但图像还未正常显示,该接口会返回失败,获取错误号为12(调用次序错误)。

#2


还用一种方式就是调用NET_DVR_RealPlay_V30时设置回调函数
得到视频数据后,调用海康播放库解码,然后自己用DDraw自己做显示,通过DDraw的离屏表面将自己的内容叠加上去;也可以调用Win32API实现,但是需要自己将得到YUV数据转换成RGB,WIN32API不支持YUV数据显示。
关于各个接口的调用历程,可以参考海康播放库文档:
流模式下
PlayM4_GetPort
PlayM4_SetStreamOpenMode
PlayM4_OpenStream
PlayM4_SetDisplayBuf
PlayM4_Play
(PlayM4_ReversePlay) 倒放接口
PlayM4_InputData
PlayM4_Stop
PlayM4_CloseStream
PlayM4_FreePort

#3


引用 1 楼 flyingshineangel 的回复:
调用NET_DVR_RigisterDrawFun试试

NET_DVR_RigisterDrawFun
预览画面叠加字符和图像,Linux下无此接口。

BOOL NET_DVR_RigisterDrawFun(
  LONG        lRealHandle,
  fDrawFun    cbDrawFun,
  DWORD       dwUser
);
Parameters
lRealHandle 
[in] NET_DVR_RealPlay或NET_DVR_RealPlay_V30的返回值 
cbDrawFun 
[in] 画图回调函数 
dwUser 
[in] 用户数据 
Callback Function
typedef void(CALLBACK *fDrawFun)(
  LONG      lRealHandle,
  HDC       hDc,
  DWORD     dwUser
);
Callback Function Parameters
lRealHandle 
[out] 当前的预览句柄 
hDc 
[out] 画图DC 
dwUser 
[out] 用户数据 
Return Values
TRUE表示成功,FALSE表示失败。获取错误码调用NET_DVR_GetLastError

Remarks
该接口主要完成注册回调函数,获得当前表面的device context。用户可以在这个DC上画图或写字,就好像在窗口的客户区DC上绘图,但这个DC不是窗口客户区的DC,而是播放器DirectDraw里的Off-Screen表面的DC。 

如果调用接口NET_DVR_RealPlay_V30进行预览,参数bBlocked建议置1(TRUE),这样预览接口返回成功即可该调用该接口。如果参数bBlocked置0,预览接口返回成功但图像还未正常显示,该接口会返回失败,获取错误号为12(调用次序错误)。

这个在SDK开发文档中有涉及,我现在就是还有点不明白,这个DC是怎么回事,怎么用.
可以直接 Graphics g= Graphics.FromImage( DC)?

#4


用C#调用海康的SDK超蛋疼,Demo中C#版本的功能超少

#5


引用 3 楼 nycgwqd 的回复:
Quote: 引用 1 楼 flyingshineangel 的回复:

调用NET_DVR_RigisterDrawFun试试

NET_DVR_RigisterDrawFun
预览画面叠加字符和图像,Linux下无此接口。

BOOL NET_DVR_RigisterDrawFun(
  LONG        lRealHandle,
  fDrawFun    cbDrawFun,
  DWORD       dwUser
);
Parameters
lRealHandle 
[in] NET_DVR_RealPlay或NET_DVR_RealPlay_V30的返回值 
cbDrawFun 
[in] 画图回调函数 
dwUser 
[in] 用户数据 
Callback Function
typedef void(CALLBACK *fDrawFun)(
  LONG      lRealHandle,
  HDC       hDc,
  DWORD     dwUser
);
Callback Function Parameters
lRealHandle 
[out] 当前的预览句柄 
hDc 
[out] 画图DC 
dwUser 
[out] 用户数据 
Return Values
TRUE表示成功,FALSE表示失败。获取错误码调用NET_DVR_GetLastError

Remarks
该接口主要完成注册回调函数,获得当前表面的device context。用户可以在这个DC上画图或写字,就好像在窗口的客户区DC上绘图,但这个DC不是窗口客户区的DC,而是播放器DirectDraw里的Off-Screen表面的DC。 

如果调用接口NET_DVR_RealPlay_V30进行预览,参数bBlocked建议置1(TRUE),这样预览接口返回成功即可该调用该接口。如果参数bBlocked置0,预览接口返回成功但图像还未正常显示,该接口会返回失败,获取错误号为12(调用次序错误)。

这个在SDK开发文档中有涉及,我现在就是还有点不明白,这个DC是怎么回事,怎么用.
可以直接 Graphics g= Graphics.FromImage( DC)?

DC是设备环境句柄,为了方便开发人员,微软将设备信息封装起来,只返回给开发人员一个DC,作为设备的标示。
MFC获取设备句柄的方式 CWnd::GetDC(); C#就不知道了。

#6


今天有朋友和我说,获取YUV视频流,然后转化为图片,对图片处理后,用回调函数回调
好像是这个意思,对么?
主要我想实现的是在, 预览画面之前,对画面进行处理,然后再预览出来


不是 回放的时候对画面进行处理。

#7


还有就是图片处理这块,也有朋友说用OpenCv,今天装了1天,刚装好,VS C++下面测试通过了,现在正在搞C#下面的测试呢,主要还是不懂啊,先装上吧,需要了用的时候也方便

#8


引用 6 楼 nycgwqd 的回复:
今天有朋友和我说,获取YUV视频流,然后转化为图片,对图片处理后,用回调函数回调
好像是这个意思,对么?
主要我想实现的是在, 预览画面之前,对画面进行处理,然后再预览出来


不是 回放的时候对画面进行处理。

openCV没有研究过。我说的第一种方式最省事,但是我没有试过;第二种方式虽然费事,但是以前做过,是行的通的。

#9


主要你说的第二种方式,是在回放录像的时候才调用的吧?我是想在预览之前进行处理,然后预览的时候显示出来呀。
我想只要预览的时候已经显示的是处理完毕的图像了,录像应该也可以录下处理过的图像吧?

#10


不知道获取的视频流可否是mp4的?我想能直接在手机上直接可以浏览的

#11


想问一下下楼主怎么在后台处理,在jsp页面上实现进本的预览?

#12


楼主,这个怎么实现,我使用C#封装了海康的SDK,但使用这个方法(获取YUV视频流)回调得到的YUV是错误的,请问在调用这个回调函数之前是否有其他的步骤要实现?

引用 6 楼 nycgwqd 的回复:
今天有朋友和我说,获取YUV视频流,然后转化为图片,对图片处理后,用回调函数回调
好像是这个意思,对么?
主要我想实现的是在, 预览画面之前,对画面进行处理,然后再预览出来


不是 回放的时候对画面进行处理。


引用 7 楼 nycgwqd 的回复:
还有就是图片处理这块,也有朋友说用OpenCv,今天装了1天,刚装好,VS C++下面测试通过了,现在正在搞C#下面的测试呢,主要还是不懂啊,先装上吧,需要了用的时候也方便


引用 7 楼 nycgwqd 的回复:
还有就是图片处理这块,也有朋友说用OpenCv,今天装了1天,刚装好,VS C++下面测试通过了,现在正在搞C#下面的测试呢,主要还是不懂啊,先装上吧,需要了用的时候也方便

#13


我想问下按时间回放时PlayM4_SetDecCallBackMend中设置DecCBFun获得数据自己播放显示,但是有个问题就是按时间回放时,回放的时间很短,还没达到时间就已经结束录像回放了。求指教

#1


调用NET_DVR_RigisterDrawFun试试

NET_DVR_RigisterDrawFun
预览画面叠加字符和图像,Linux下无此接口。

BOOL NET_DVR_RigisterDrawFun(
  LONG        lRealHandle,
  fDrawFun    cbDrawFun,
  DWORD       dwUser
);
Parameters
lRealHandle 
[in] NET_DVR_RealPlay或NET_DVR_RealPlay_V30的返回值 
cbDrawFun 
[in] 画图回调函数 
dwUser 
[in] 用户数据 
Callback Function
typedef void(CALLBACK *fDrawFun)(
  LONG      lRealHandle,
  HDC       hDc,
  DWORD     dwUser
);
Callback Function Parameters
lRealHandle 
[out] 当前的预览句柄 
hDc 
[out] 画图DC 
dwUser 
[out] 用户数据 
Return Values
TRUE表示成功,FALSE表示失败。获取错误码调用NET_DVR_GetLastError

Remarks
该接口主要完成注册回调函数,获得当前表面的device context。用户可以在这个DC上画图或写字,就好像在窗口的客户区DC上绘图,但这个DC不是窗口客户区的DC,而是播放器DirectDraw里的Off-Screen表面的DC。 

如果调用接口NET_DVR_RealPlay_V30进行预览,参数bBlocked建议置1(TRUE),这样预览接口返回成功即可该调用该接口。如果参数bBlocked置0,预览接口返回成功但图像还未正常显示,该接口会返回失败,获取错误号为12(调用次序错误)。

#2


还用一种方式就是调用NET_DVR_RealPlay_V30时设置回调函数
得到视频数据后,调用海康播放库解码,然后自己用DDraw自己做显示,通过DDraw的离屏表面将自己的内容叠加上去;也可以调用Win32API实现,但是需要自己将得到YUV数据转换成RGB,WIN32API不支持YUV数据显示。
关于各个接口的调用历程,可以参考海康播放库文档:
流模式下
PlayM4_GetPort
PlayM4_SetStreamOpenMode
PlayM4_OpenStream
PlayM4_SetDisplayBuf
PlayM4_Play
(PlayM4_ReversePlay) 倒放接口
PlayM4_InputData
PlayM4_Stop
PlayM4_CloseStream
PlayM4_FreePort

#3


引用 1 楼 flyingshineangel 的回复:
调用NET_DVR_RigisterDrawFun试试

NET_DVR_RigisterDrawFun
预览画面叠加字符和图像,Linux下无此接口。

BOOL NET_DVR_RigisterDrawFun(
  LONG        lRealHandle,
  fDrawFun    cbDrawFun,
  DWORD       dwUser
);
Parameters
lRealHandle 
[in] NET_DVR_RealPlay或NET_DVR_RealPlay_V30的返回值 
cbDrawFun 
[in] 画图回调函数 
dwUser 
[in] 用户数据 
Callback Function
typedef void(CALLBACK *fDrawFun)(
  LONG      lRealHandle,
  HDC       hDc,
  DWORD     dwUser
);
Callback Function Parameters
lRealHandle 
[out] 当前的预览句柄 
hDc 
[out] 画图DC 
dwUser 
[out] 用户数据 
Return Values
TRUE表示成功,FALSE表示失败。获取错误码调用NET_DVR_GetLastError

Remarks
该接口主要完成注册回调函数,获得当前表面的device context。用户可以在这个DC上画图或写字,就好像在窗口的客户区DC上绘图,但这个DC不是窗口客户区的DC,而是播放器DirectDraw里的Off-Screen表面的DC。 

如果调用接口NET_DVR_RealPlay_V30进行预览,参数bBlocked建议置1(TRUE),这样预览接口返回成功即可该调用该接口。如果参数bBlocked置0,预览接口返回成功但图像还未正常显示,该接口会返回失败,获取错误号为12(调用次序错误)。

这个在SDK开发文档中有涉及,我现在就是还有点不明白,这个DC是怎么回事,怎么用.
可以直接 Graphics g= Graphics.FromImage( DC)?

#4


用C#调用海康的SDK超蛋疼,Demo中C#版本的功能超少

#5


引用 3 楼 nycgwqd 的回复:
Quote: 引用 1 楼 flyingshineangel 的回复:

调用NET_DVR_RigisterDrawFun试试

NET_DVR_RigisterDrawFun
预览画面叠加字符和图像,Linux下无此接口。

BOOL NET_DVR_RigisterDrawFun(
  LONG        lRealHandle,
  fDrawFun    cbDrawFun,
  DWORD       dwUser
);
Parameters
lRealHandle 
[in] NET_DVR_RealPlay或NET_DVR_RealPlay_V30的返回值 
cbDrawFun 
[in] 画图回调函数 
dwUser 
[in] 用户数据 
Callback Function
typedef void(CALLBACK *fDrawFun)(
  LONG      lRealHandle,
  HDC       hDc,
  DWORD     dwUser
);
Callback Function Parameters
lRealHandle 
[out] 当前的预览句柄 
hDc 
[out] 画图DC 
dwUser 
[out] 用户数据 
Return Values
TRUE表示成功,FALSE表示失败。获取错误码调用NET_DVR_GetLastError

Remarks
该接口主要完成注册回调函数,获得当前表面的device context。用户可以在这个DC上画图或写字,就好像在窗口的客户区DC上绘图,但这个DC不是窗口客户区的DC,而是播放器DirectDraw里的Off-Screen表面的DC。 

如果调用接口NET_DVR_RealPlay_V30进行预览,参数bBlocked建议置1(TRUE),这样预览接口返回成功即可该调用该接口。如果参数bBlocked置0,预览接口返回成功但图像还未正常显示,该接口会返回失败,获取错误号为12(调用次序错误)。

这个在SDK开发文档中有涉及,我现在就是还有点不明白,这个DC是怎么回事,怎么用.
可以直接 Graphics g= Graphics.FromImage( DC)?

DC是设备环境句柄,为了方便开发人员,微软将设备信息封装起来,只返回给开发人员一个DC,作为设备的标示。
MFC获取设备句柄的方式 CWnd::GetDC(); C#就不知道了。

#6


今天有朋友和我说,获取YUV视频流,然后转化为图片,对图片处理后,用回调函数回调
好像是这个意思,对么?
主要我想实现的是在, 预览画面之前,对画面进行处理,然后再预览出来


不是 回放的时候对画面进行处理。

#7


还有就是图片处理这块,也有朋友说用OpenCv,今天装了1天,刚装好,VS C++下面测试通过了,现在正在搞C#下面的测试呢,主要还是不懂啊,先装上吧,需要了用的时候也方便

#8


引用 6 楼 nycgwqd 的回复:
今天有朋友和我说,获取YUV视频流,然后转化为图片,对图片处理后,用回调函数回调
好像是这个意思,对么?
主要我想实现的是在, 预览画面之前,对画面进行处理,然后再预览出来


不是 回放的时候对画面进行处理。

openCV没有研究过。我说的第一种方式最省事,但是我没有试过;第二种方式虽然费事,但是以前做过,是行的通的。

#9


主要你说的第二种方式,是在回放录像的时候才调用的吧?我是想在预览之前进行处理,然后预览的时候显示出来呀。
我想只要预览的时候已经显示的是处理完毕的图像了,录像应该也可以录下处理过的图像吧?

#10


不知道获取的视频流可否是mp4的?我想能直接在手机上直接可以浏览的

#11


想问一下下楼主怎么在后台处理,在jsp页面上实现进本的预览?

#12


楼主,这个怎么实现,我使用C#封装了海康的SDK,但使用这个方法(获取YUV视频流)回调得到的YUV是错误的,请问在调用这个回调函数之前是否有其他的步骤要实现?

引用 6 楼 nycgwqd 的回复:
今天有朋友和我说,获取YUV视频流,然后转化为图片,对图片处理后,用回调函数回调
好像是这个意思,对么?
主要我想实现的是在, 预览画面之前,对画面进行处理,然后再预览出来


不是 回放的时候对画面进行处理。


引用 7 楼 nycgwqd 的回复:
还有就是图片处理这块,也有朋友说用OpenCv,今天装了1天,刚装好,VS C++下面测试通过了,现在正在搞C#下面的测试呢,主要还是不懂啊,先装上吧,需要了用的时候也方便


引用 7 楼 nycgwqd 的回复:
还有就是图片处理这块,也有朋友说用OpenCv,今天装了1天,刚装好,VS C++下面测试通过了,现在正在搞C#下面的测试呢,主要还是不懂啊,先装上吧,需要了用的时候也方便

#13


我想问下按时间回放时PlayM4_SetDecCallBackMend中设置DecCBFun获得数据自己播放显示,但是有个问题就是按时间回放时,回放的时间很短,还没达到时间就已经结束录像回放了。求指教