基于视频监控绘图的二次编解码方法及其装置的制作方法

文档序号:7854189阅读:158来源:国知局
专利名称:基于视频监控绘图的二次编解码方法及其装置的制作方法
技术领域
本申请涉及一种基于视频监控绘图的二次编解码方法及其装置,尤其涉及视频监控领域中基于视频监控绘图的二次编解码方法及其装置。
背景技术
当前,当在视频监控系统中进行不同厂商的平台(以下简称不同平台,并且这里所谓的平台包括硬件和运行于该硬件之上的软件)的互联时,图像数据的接入方法通常是由一厂商提供SDK (软件开发工具包)把该厂商的平台的码流回调给另一厂商的设备,其中,回调的码流通常有三种形式1、解码后的原始码流,数据量太大,不利于网络传输,必须要作转换;2、解码前的外厂商私有码流,可以不转换,但需要在用户端调用外厂商提供的解码器进行解码;3、解码前的标准码流,不用转换,可以直接支持。
图I示例性示出了一种现有技术的视频监控系统中不同平台互联的示意图。如图I中所示,现有技术的视频监控系统例如包括A平台1、A平台SDK 3、B平台接入网关(以下简称网关)4和B平台6。当A平台I与B平台6进行互联时,A平台SDK 3把A平台的码流(以下简称A码流)2回调给网关4,网关4将A码流2进行二次编解码后转换成B平台的码流(以下简称B码流)5,从而能够输出到B平台6。图I所示的不同平台互联的方法是目前视频监控系统中不同平台互联的一种典型的常用方法。但是,由于视频监控设备无通用的行业标准,某些厂商提供的SDK没有码流获取接口,而是直接把其平台输出的图像绘制到显示设备的窗口(以下简称窗口,未示出,并且这里的窗口包括显示器窗口和对应于该显示器窗口的软件模块)上,即直接在窗口上绘图,从而导致其他平台无法与其进行互联。例如,A平台I不提供码流回调,B平台6就无法接入A平台I的码流。

发明内容
为了解决上述技术问题,本申请提供了一种基于视频监控绘图的二次编解码方法,包括截获第一平台的SDK打算调用的系统绘图API或COM接口 ;通过接口替换库,调用自定义绘图函数来替换所截获的系统绘图API或COM接口,其中所述自定义绘图函数的声明格式应当与所截获的系统绘图API或COM接口的声明格式一致;确定要捕获码流的目标窗口,并通过所述自定义绘图函数来提取发往所确定的目标窗口的第一平台的码流;以及将所捕获的第一平台的码流发送给网关,二次编解码后成为第二平台的码流,并发送给所述第二平台。通过Detours,调用所述自定义绘图函数来替换所截获的系统绘图API或COM接□。通过所述接口替换库,调用安排在一个动态链接库中的所述自定义绘图函数来替换所截获的系统绘图API或COM接口。所述自定义绘图函数被调用后,从去往所截获的系统绘图API或COM接口的参数中提取出所述第一平台的码流。在通过所述自定义绘图函数来提取发往所确定的目标窗口的第一平台的码流的同时绘制对应于所述第一平台的码流的图像。在未确定所述目标窗口的情况下,不提取所述第一平台的码流。本申请还提供了一种基于视频监控绘图的二次编解码装置,包括截获模块,用于截获第一平台的SDK打算调用的系统绘图API或COM接口 ;替换模块,用于通过接口替换库,调用自定义绘图函数来替换所截获的系统绘图API或COM接口,其中所述自定义绘图函数的声明格式应当与所截获的系统绘图API或COM接口的声明格式一致;提取模块,用于确定要捕获码流的目标窗口,并通过所述自定义绘图函数来提取发往所确定的目标窗口的第一平台的码流;以及发送模块,用于将所捕获的第一平台的码流发送给网关,二次编解码后成为第二平台的码流,并发送给所述第二平台。、
所述替换模块,用于通过Detours,调用所述自定义绘图函数来替换所截获的系统绘图API或COM接口。所述替换模块,用于通过所述接口替换库,调用安排在一个动态链接库中的所述自定义绘图函数来替换所截获的系统绘图API或COM接口。所述提取模块,用于所述自定义绘图函数被调用后,从去往所截获的系统绘图API或COM接口的参数中提取出所述第一平台的码流。所述提取模块,用于在通过所述自定义绘图函数来提取发往所确定的目标窗口的第一平台的码流的同时绘制对应于所述第一平台的码流的图像。所述提取模块,用于在未确定所述目标窗口的情况下,不提取所述第一平台的码流。经过验证,本申请的基于绘图的二次编解码方法及其装置在进行不同厂商的视频监控平台的互联时,如果不提供码流回调接口,同样可以获取到各厂商的视频监控平台的码流,从而实现不同厂商的视频监控平台的互联。


下面将参照所附附图来描述本申请的实施例,其中图I示例性示出了一种现有技术的视频监控系统中不同平台互联的示意图;图2示例性示出了根据本申请的视频监控系统中不同平台互联的实施例的示意图;以及图3示例性示出了根据本申请的基于视频监控绘图的二次编解码方法的实施例的流程图。
具体实施例方式下面将结合图2和图3详细描述本申请的基于绘图的二次编解码方法及其装置。图2示例性示出了根据本申请的视频监控系统中不同平台互联的实施例的示意图。如图2中所示,根据本申请的视频监控系统例如除了包括图I中所示的A平台I、A平台SDK 3、网关4和B平台6之外,还包括截获替换模块7。其中,截获替换模块7包括接口替换库8和用户自定义的绘图函数(以下简称自定义绘图函数)9,其中用户自定义绘图函数9可以包含在一个用户自定义的自定义DLL (动态链接库)10中,如图2所示。接口替换库8例如可以是Detours, Detours是微软研究院提供的一套替换系统API (应用程序编程接口)或COM (组件对象模型)接口的函数库,可以把系统API或COM接口替换为用户自己提供的接口函数,例如本申请的自定义绘图函数9。例如,当把原有的系统绘图API替换为自定义绘图函数9后,则在调用该系统绘图API时,系统就会自动调用自定义的绘图函数9,而不是调用该系统绘图API。当A平台SDK 3要在一个或多个窗口(未示出)上显示图像时,原本会调用用于图像显示的系统绘图API或COM接口,然而,由于本申请的截获替换模块7被安排来截获系统绘图API或COM接口,因此,只要A平台SDK 3进行绘图,就会被截获替换模块7安排为通
过接口替换库8调用自定义绘图函数9,于是自定义绘图函数9就可以根据原本打算去往相应的系统绘图API或COM接口的参数来提取A平台I输出的A码流2。其中,系统绘图API或COM接口的替换只对当前进程有效,也就是说,只在进行系统绘图API或COM接口替换的进程内有效,不会影响到系统其它进程。如图2中所示,例如A平台SDK 3没有码流获取接口,通常只能直接把A平台I输出的图像绘制到窗口上,即A平台I与B平台6不能进行互联。然而,在本申请的安排中,为了使A平台I与B平台6能够进行互联,安排了截获替换模块7。在进行绘图时,截获替换模块7中的接口替换库8截获A平台SDK 3打算调用的系统绘图API或COM接口,并将A平台SDK 3打算调用的系统绘图API或COM接口替换为自定义绘图函数9。自定义绘图函数9从A平台SDK 3原本打算去往系统绘图API或COM接口的参数中提取出A码流2,并将A码流2转发给网关4以进行二次编解码,从而实现把A平台I的A码流2输出到B平台6,即实现本申请的基于视频监控绘图的二次编解码方法。结合图2,图3示例性示出了根据本申请的基于视频监控绘图的二次编解码方法的实施例的流程图。具体地,根据本申请的基于视频监控绘图的二次编解码方法包括如下步骤首先,在步骤S100,本发明的截获替换模块7截获A平台I的A平台SDK 3打算调用的系统绘图API或COM接口。然后,在步骤SI 10,本发明的截获替换模块7通过接口替换库8,调用自定义DLL10中的自定义绘图函数9来替换所截获的系统绘图API或COM接口,其中自定义绘图函数9的声明格式应当与所截获的系统绘图API或COM接口的声明格式一致。以系统API StretchDIBits为例,自定义绘图函数9可以是函数签名为intWINAPI Mine_StretchDIBits(HDC hdc, int XDest,int YDest,int nDestffidth, intnDestHeight, int XSrc, int YSrc, int nSrcffidth, int nSrcHeight, CONSTV0ID*lpBits, CONST BITMAPINFO*lpBitsInfo, UINT iUsage, DWORD dwRop)的函数。在随后的步骤中,当A平台SDK 3打算绘图时就会试图调用系统API StretchDIBits,然而截获替换模块7调用用户自己编写的这个Mine_StretChDIBitS函数替换了系统API StretchDIBits,从而A平台SDK 3实际上调用的是用户自己编写的这个Mine_StretchDIBits函数,这样就可以通过用户自己编写的这个Mine_StretchDIBits函数从A平台SDK 3发来的数据中提取出A码流2。也可以根据实际需要决定是否继续同时调用系统API StretchDIBits以把对应码流的图像同时绘制到窗口上。例如,作为自定义绘图函数9的源程序可以具体包括
int. WlNAPI Mine StretchDIBits(HDC hdc,int XDestJnt YDestjntn DestWidthjnl nDestHeightjnt XSrc, int YSrcjnt nSrcWidth,intnSrcHeiglU5CONST VOID siiIpBits5CONST BiTMAPiNFO ^ipBitsInfo,UlNTI Usage, DWO R D dwRop)
{
HWND hWnd = :: WindowFromDC(Iidc);BOOLbFind = FALSE; tHAPIHWndlnfo* ptlnfo = NULL;//根据此次绘图窗口的句柄,在我们关心的窗口列表中查找是否存在此窗口的相关信息
::EnterCriticalSection(&e csHwnd):
、. S_.'__J ■■
if (! gmapHwndlnfo .emptyQ)
{
C MapH w ndI nfo:: i terator i t( g ma p H wild I nfo. finci(h Wnd)); if (it != g mapHwndInfo.end())
I
ptlnfo,it->second; bFind =TRLC;
}
I
::LeaveCri ticalSection(&g_csHwnd);
//判断是否用户关心的窗口句柄,如果是,则提取图像数据回调
给上层
if (FALSE != bFind && NULL != ptInfo->pfnVideoCB)
{
//DIB内部的图像必为RGB,
BITMAPINFOHEADER*p Header=
(BITM APIN FO H E ADE R *)&(IpBi tsI nfo->bm i H eader);
DWORD dwType = cm HAPI Frame Unknown; switch(pHeader->biBitCount)
I
cas< 24
dwType = em HAPI Video RGB24; break; case 32:
dwType = em—HAPI—Video—RG B 3 2: break; default:

_MyPrintf((" 不支持的格式
BITM A PIN FOH EADER: :biBitCount=%d\nM, pHeader->bi BitCount));
break;
}
long nHeight = (0 < pHeader->biHeight) pHeader->biHeight:(-pH eade r->bi Height);
if (pHeader->biHeight > 0)
{
int riLi.rieL.en = p H ead er->bi W idth *pHeader->biBitCount / 8:
int nOffSet = pHeader->biSizeImage - nLineLen;
byte *pBuiTmp = ptinfo->pbyBufl6;
for (int nLine = pHeader-^biHeight - I; nLine >=0 ;
—nLine)
{
me mcpy (p B u fTinp, (char 5^lpBits 十 nOffSet,
nLineLen);
pBufTmp += nLineLen; nOffSet -= nLineLen;
}
}
_MyPrintf( (" Stretch DIBits hWnd=%x 宽=%d 高=%d
type=%d\n",
hWnd, pHeader->biWidlh, nHeight, dwTvpe)); bDraw = ptInfo->pfnVideoCB(hWnd, ptInfo->pbyBufl6,dvvType, pH eader->biS izeI mage,
pHeader->biWidth, .nHeight, ptInfo->dwUserDara);
}
//根据需要决定是否继续调用系统绘图函数以显示图像,如果不调用则图像不会显示

int iiRet = 0;if (FALSE != bDraw)
{
iiRet = CInterceptSpyFun;:m_pFimStretchDlBits(hdc, XDest,YDest, nDestWidth, nDestHeight,
XSrc, YSrc, nSrcWidth, nSrcHeight, IpBits, lpBitsInfo,
iUsage, dwRop);
} return nRet;
} °截获替换模块7调用用户自己编写的自定义绘图函数9来替换相应的系统绘图API或COM接口,也就是说,当A平台SDK 3打算绘图时,截获替换模块7中的接口替换库8就会截获A平台SDK 3打算调用的系统绘图API或COM接口(例如系统APIStretchDIBits),并将A平台SDK3打算调用的系统绘图API或COM接口替换为自定义DLL10中的自定义绘图函数9 (例如这里的Mine_StretchDIBits函数)。例如,实现截获替换模块7的拦截处理的源程序可以具体包括
//Detour库拦截处理DetourTransactioriBeginO;
DetourUpdateThread(GetCurrentThreadO):
DetourAltach( fe(PVOID&)CInterceptSpyFun::m_pFunStretchDIBits.
M i ne—Stretch DI Bits);
DetourTransactionCommi t(),,接下来,在步骤S120,本发明的截获替换模块7确定要捕获码流的目标窗口,并通过自定义绘图函数9来提取发往所确定的目标窗口的A平台I的A码流2。这里,要捕获码流的目标窗口是原本打算用于目标平台(这里例如是A平台I)显不输出的窗口或多个窗口之一。指定要捕获码流的目标窗口的一个手段是把该窗口的句柄添加到捕获队列中,这样可以只捕获指定窗口的码流,而不会对系统所有窗口都进行捕获。作为另一个实施例,可以安排为,在不添加捕获码流的目标窗口的情况下,即使系统调用到了自定义绘图函数9,也不会做出码流提取操作,而是只简单地再次调用系统绘图API或COM接口以完成图像显示。只有添加了捕获码流的目标窗口,表明所关注的是这个窗口的绘图操作,才会提取其图像数据以回调给应用层业务。例如,实现确定要捕获码流的目标窗口的源程序可以具体包括//增加一个窗口句柄
BOOL HAPI AddHWndInfo(HWND hWnd, DWORD dwUserData,pfiiHAPI FrameCallBack pfnVideoCB)
{
BOOL bWnd = :: Is W indow(hWnd); //判断是否是窗口 if (FALSE != bWnd && NULL != pfnVideoCB)
{
::EnterCritical Section(&g_csHwnd);
//保存句柄数据同时清空数据记录 IHAPI HWnd Info * pHwndlnfo = NULL; i f (gvec H wn d I n fo ■ emp ty ())
{
pHwndlnfo = new tHAPIHWndlnfo;
.)
else
{
pHwndlnfo = gvec Hvvnd Info
; g_vecHwndinfo.erase(g_vecHvvndlnfo.begin()); pHvvndinfo-> Reset();
}
pH wnd I n fo ->d w U ser Data = dwUserData;pHwndInfo->pfnV i deoCB = pfnVideoCB;g_mapH vvndi nfo[h W nd] = pHwndlnfo;
_MyPrintf(("HAPI AddHWndInfo 添加句柄成功hwnd=0x%08x,cb=0x%08x\n", hWnd, pHwndInfo->pfnVideoCB));::LeaveCriticaISection(&g_csHwnd);
}
else {
—MyPrintf((”HAPI—AddHWndinfo 添力丨i〈丨J柄失败 hwnd=%xpfVideo=%p 参数巧、!! :确! \n”,hWnd, pfnVideoCB));
}
return bWnd;
} °截获替换模块7通过自定义绘图函数9捕获A平台SDK 3发往所确定的目标窗口的数据,进行码流提取,即,截获替换模块7中的自定义绘图函数9被调用后,从去往所截获的系统绘图API或COM接口的参数中提取出A码流2。接下来,在步骤S130,本发明的截获替换模块7将所捕获的A平台I的A码流2发送给网关4,二次编解码后成为B平台6的B码流5,并发送给B平台6。通过本发明的上述步骤SlOO至步骤S130,即可实现本申请的基于视频监控绘图的二次编解码方法。另外,当上述操作完成之后,在不需要继续捕获码流时,截获替换模块7可以通过把捕获码流的目标窗口的句柄从捕获队列中删除来删除该捕获码流的目标窗口,以避免不必要的系统性能消耗。例如,实现删除要捕获码流的目标窗口的源程序可以具体包括
//删除某一个窗口句柄
BOOL HAPI DeleteHWndInfofHWND IiWnd)
{
::EnterCritica]Section(&g_csHwnd);
CMapHwndI nfo:: iterator it(g mapH wnd Info. find(h Wnd));if (it != g mapH wndlnfo.end())
{
gvec H wndlnfo. push_back(it->second); gmap H wndln fo .erase(it);
_MyPrintf(("HAPI_DeleteHWndInfo 删「f 句柄成功hwnd=0x%08x\nM, IiWnd));
}
::LeaveCnticalSection(&g_csHwnd); return TRUE;}o最后,截获替换模块7还可以恢复系统绘图API或COM接口。例如,程序退出或不需要再捕获码流时,可以调用Detours库接口函数恢复对系统进程的修改。例如,实现恢复系统绘图API或COM接口的源程序可以具体包括
//取消拦截
DetourTransactionBegin();
DetourUpdateThread(GetCuiTentThreadO);
DetourDetach( &(PVOID &)CIntercep{SpyFun::ni_pFunStretchDIBits,MineStretchDI Bits);
DetourTransactionCommitG。本申请的截获替换模块7中的接口替换库8例如是Detours,Detours本身包括两个DLL,本申请的截获替换模块7中的自定义绘图函数9安排在另一个DLL 10中,这个DLL10提供接口,其它模块可以通过调用这个DLL 10提供的接口来实现本申请的基于视频监控绘图的二次编解码方法。例如,实现截获替换模块7所提供的接口的源程序可以具体包括
//码流回调函数类型声明
typedef BOOL (WIN API* pfn H A PIFrameCal I Back)( H WN D h Play Wnd,const BYTE * pBuf, DWORD dwType, DWORD dwLength,
DWORD dwWidtlL DWORD dwHeight, DWORD dwUserData);

//替换系统绘图API或COM接口
extem”C” HOOKAPI API DWORD HAPI」nitHookApi():
//恢复系统绘图API或COM接P
extem”C” HOOKAPI API DWORD HAPI_ReieaseHookApi():
//添加要捕获的窗口句柄,开始对这个窗口进行捕获extern"C" HOOKAPI API BOOL HAPl AddHVVndInfo(HWND hWnd,DWORD dwUserData, pfnHAPI FrameCallBack pfnVideoCB);
//删除要捕获的窗口句柄,停止对这个窗口进行捕获extern"C" HOOKAPIAPI BOOL HAPi_DeleteHWndinfo(HWNDhWnd);) o
本申请还提供了一种基于视频监控绘图的二次编解码装置,包括截获模块,用于截获第一平台的SDK打算调用的系统绘图API或COM接口 ;替换模块,用于通过接口替换库,调用自定义绘图函数来替换所截获的系统绘图API或COM接口,其中所述自定义绘图函数的声明格式应当与所截获的系统绘图API或COM接口的声明格式一致;提取模块,用于确定要捕获码流的目标窗口,并通过所述自定义绘图函数来提取发往所确定的目标窗口的第一平台的码流;以及发送模块,用于将所捕获的第一平台的码流发送给网关,二次编解码后成为第二平台的码流,并发送给所述第二平台。经过验证,本申请的基于绘图的二次编解码方法及其装置在进行不同厂商的视频监控平台的互联时,如果不提供码流回调接口,同样可以获取到各厂商的视频监控平台的码流,从而实现不同厂商的视频监控平台的互联。根据本申请的基于绘图的二次编解码方法可以由具有运算处理能力的单个或多个处理设备,如单个或多个计算机,运行计算机可执行指令来实现。根据本申请的基于绘图的二次编解码装置可以为单个或多个处理设备,如单个或多个计算机,其中的各个模块或单元可以为该处理设备运行计算机可执行指令时具有相应功能的设备组件。根据本申请的一个实施例,可以使用C/C++等语言在Linux、Windows等系统下来实现上述用于实现在进程间进行数据交互访问的方法及其装置。虽然已参照典型实施例描述了本申请,但应当理解,所用的术语是说明和示例性、而非限制性的术语。由于本申请能够以多种形式具体实施,所以应当理解,上述实施例不限于任何前述的细节,而应在随附权利要求所限定的范围内广泛地解释,因此落入权利要求或其等同范围内的全部变化和改型都应为随附权利要求所涵盖。
权利要求
1.一种基于视频监控绘图的二次编解码方法,包括 截获第一平台的SDK打算调用的系统绘图API或COM接口; 通过接口替换库,调用自定义绘图函数来替换所截获的系统绘图API或COM接口,其中所述自定义绘图函数的声明格式应当与所截获的系统绘图API或COM接口的声明格式一致; 确定要捕获码流的目标窗口,并通过所述自定义绘图函数来提取发往所确定的目标窗口的第一平台的码流;以及 将所捕获的第一平台的码流发送给网关,二次编解码后成为第二平台的码流,并发送给所述第二平台。
2.根据权利要求I所述的方法,其中 通过Detours,调用所述自定义绘图函数来替换所截获的系统绘图API或COM接口。
3.根据权利要求I所述的方法,其中 通过所述接口替换库,调用安排在一个动态链接库中的所述自定义绘图函数来替换所截获的系统绘图API或COM接口。
4.根据权利要求I所述的方法,其中 所述自定义绘图函数被调用后,从去往所截获的系统绘图API或COM接口的参数中提取出所述第一平台的码流。
5.根据权利要求I所述的方法,其中 在通过所述自定义绘图函数来提取发往所确定的目标窗口的第一平台的码流的同时绘制对应于所述第一平台的码流的图像。
6.根据权利要求I所述的方法,其中 在未确定所述目标窗口的情况下,不提取所述第一平台的码流。
7.一种基于视频监控绘图的二次编解码装置,包括 截获模块,用于截获第一平台的SDK打算调用的系统绘图API或COM接口 ; 替换模块,用于通过接口替换库,调用自定义绘图函数来替换所截获的系统绘图API或COM接口,其中所述自定义绘图函数的声明格式应当与所截获的系统绘图API或COM接口的声明格式一致; 提取模块,用于确定要捕获码流的目标窗口,并通过所述自定义绘图函数来提取发往所确定的目标窗口的第一平台的码流;以及 发送模块,用于将所捕获的第一平台的码流发送给网关,二次编解码后成为第二平台的码流,并发送给所述第二平台。
8.根据权利要求7所述的装置,其中 所述替换模块,用于通过Detours,调用所述自定义绘图函数来替换所截获的系统绘图API 或 COM 接口。
9.根据权利要求7所述的装置,其中 所述替换模块,用于通过所述接口替换库,调用安排在一个动态链接库中的所述自定义绘图函数来替换所截获的系统绘图API或COM接口。
10.根据权利要求7所述的装置,其中 所述提取模块,用于所述自定义绘图函数被调用后,从去往所截获的系统绘图API或COM接口的参数中提取出所述第一平台的码流。
11.根据权利要求7所述的装置,其中 所述提取模块,用于在通过所述自定义绘图函数来提取发往所确定的目标窗口的第一平台的码流的同时绘制对应于所述第一平台的码流的图像。
12.根据权利要求7所述的装置,其中 所述提取模块,用于在未确定所述目标窗口的情况下,不提取所述第一平台的码流。
全文摘要
一种基于视频监控绘图的二次编解码方法,包括截获第一平台的SDK打算调用的系统绘图API或COM接口;通过接口替换库,调用自定义绘图函数来替换所截获的系统绘图API或COM接口,其中所述自定义绘图函数的声明格式应当与所截获的系统绘图API或COM接口的声明格式一致;确定要捕获码流的目标窗口,并通过所述自定义绘图函数来提取发往所确定的目标窗口的第一平台的码流;以及将所捕获的第一平台的码流发送给网关,二次编解码后成为第二平台的码流,并发送给所述第二平台。一种基于视频监控绘图的二次编解码装置包括与所述基于视频监控绘图的二次编解码方法的步骤分别对应的截获模块、替换模块、提取模块和发送模块。
文档编号H04N7/26GK102722376SQ201210209788
公开日2012年10月10日 申请日期2012年6月25日 优先权日2012年6月25日
发明者朱亚东, 王晓辉 申请人:苏州科达科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1