我现在已经实现了基本的录像、预览、抓图等功能,目前我想做的是,在预览开启之前,对图像进行一些处理后再预览出来。比如说在预览画面上增加一个矩形框等
没有做过关于视频流的分析,我的想法是,有没有办法可以对视频流进行分解,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(调用次序错误)。
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
得到视频数据后,调用海康播放库解码,然后自己用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
这个在SDK开发文档中有涉及,我现在就是还有点不明白,这个DC是怎么回事,怎么用.
可以直接 Graphics g= Graphics.FromImage( DC)?
#4
用C#调用海康的SDK超蛋疼,Demo中C#版本的功能超少
#5
DC是设备环境句柄,为了方便开发人员,微软将设备信息封装起来,只返回给开发人员一个DC,作为设备的标示。
MFC获取设备句柄的方式 CWnd::GetDC(); C#就不知道了。
#6
今天有朋友和我说,获取YUV视频流,然后转化为图片,对图片处理后,用回调函数回调
好像是这个意思,对么?
主要我想实现的是在, 预览画面之前,对画面进行处理,然后再预览出来
不是 回放的时候对画面进行处理。
好像是这个意思,对么?
主要我想实现的是在, 预览画面之前,对画面进行处理,然后再预览出来
不是 回放的时候对画面进行处理。
#7
还有就是图片处理这块,也有朋友说用OpenCv,今天装了1天,刚装好,VS C++下面测试通过了,现在正在搞C#下面的测试呢,主要还是不懂啊,先装上吧,需要了用的时候也方便
#8
今天有朋友和我说,获取YUV视频流,然后转化为图片,对图片处理后,用回调函数回调
好像是这个意思,对么?
主要我想实现的是在, 预览画面之前,对画面进行处理,然后再预览出来
不是 回放的时候对画面进行处理。
openCV没有研究过。我说的第一种方式最省事,但是我没有试过;第二种方式虽然费事,但是以前做过,是行的通的。
#9
主要你说的第二种方式,是在回放录像的时候才调用的吧?我是想在预览之前进行处理,然后预览的时候显示出来呀。
我想只要预览的时候已经显示的是处理完毕的图像了,录像应该也可以录下处理过的图像吧?
我想只要预览的时候已经显示的是处理完毕的图像了,录像应该也可以录下处理过的图像吧?
#10
不知道获取的视频流可否是mp4的?我想能直接在手机上直接可以浏览的
#11
想问一下下楼主怎么在后台处理,在jsp页面上实现进本的预览?
#12
楼主,这个怎么实现,我使用C#封装了海康的SDK,但使用这个方法(获取YUV视频流)回调得到的YUV是错误的,请问在调用这个回调函数之前是否有其他的步骤要实现?
今天有朋友和我说,获取YUV视频流,然后转化为图片,对图片处理后,用回调函数回调
好像是这个意思,对么?
主要我想实现的是在, 预览画面之前,对画面进行处理,然后再预览出来
不是 回放的时候对画面进行处理。
还有就是图片处理这块,也有朋友说用OpenCv,今天装了1天,刚装好,VS C++下面测试通过了,现在正在搞C#下面的测试呢,主要还是不懂啊,先装上吧,需要了用的时候也方便
还有就是图片处理这块,也有朋友说用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(调用次序错误)。
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
得到视频数据后,调用海康播放库解码,然后自己用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
调用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
调用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
今天有朋友和我说,获取YUV视频流,然后转化为图片,对图片处理后,用回调函数回调
好像是这个意思,对么?
主要我想实现的是在, 预览画面之前,对画面进行处理,然后再预览出来
不是 回放的时候对画面进行处理。
openCV没有研究过。我说的第一种方式最省事,但是我没有试过;第二种方式虽然费事,但是以前做过,是行的通的。
#9
主要你说的第二种方式,是在回放录像的时候才调用的吧?我是想在预览之前进行处理,然后预览的时候显示出来呀。
我想只要预览的时候已经显示的是处理完毕的图像了,录像应该也可以录下处理过的图像吧?
我想只要预览的时候已经显示的是处理完毕的图像了,录像应该也可以录下处理过的图像吧?
#10
不知道获取的视频流可否是mp4的?我想能直接在手机上直接可以浏览的
#11
想问一下下楼主怎么在后台处理,在jsp页面上实现进本的预览?
#12
楼主,这个怎么实现,我使用C#封装了海康的SDK,但使用这个方法(获取YUV视频流)回调得到的YUV是错误的,请问在调用这个回调函数之前是否有其他的步骤要实现?
今天有朋友和我说,获取YUV视频流,然后转化为图片,对图片处理后,用回调函数回调
好像是这个意思,对么?
主要我想实现的是在, 预览画面之前,对画面进行处理,然后再预览出来
不是 回放的时候对画面进行处理。
还有就是图片处理这块,也有朋友说用OpenCv,今天装了1天,刚装好,VS C++下面测试通过了,现在正在搞C#下面的测试呢,主要还是不懂啊,先装上吧,需要了用的时候也方便
还有就是图片处理这块,也有朋友说用OpenCv,今天装了1天,刚装好,VS C++下面测试通过了,现在正在搞C#下面的测试呢,主要还是不懂啊,先装上吧,需要了用的时候也方便
#13
我想问下按时间回放时PlayM4_SetDecCallBackMend中设置DecCBFun获得数据自己播放显示,但是有个问题就是按时间回放时,回放的时间很短,还没达到时间就已经结束录像回放了。求指教