两个回调函数:

FRealDataCallBack 实现预览回调数据

DecCallBack    解码回调函数

在HCNetSDK.java补充相关函数和结构声明

69c5a8ac3fa60e0848d784a6dd461da6.png//播放库函数声明,PlayCtrl.dll

interface PlayCtrl extendsStdCallLibrary

{

PlayCtrl INSTANCE= (PlayCtrl) Native.loadLibrary("lib\\PlayCtrl", PlayCtrl.class);public static final int STREAME_REALTIME = 0;public static final int STREAME_FILE = 1;//20140501, cuizhenfu@gmail.com, frame type

public static final int T_AUDIO16 = 101;public static final int T_AUDIO8 = 100;public static final int T_UYVY = 1;public static final int T_YV12 = 3;public static final int T_RGB32 = 7;booleanPlayM4_GetPort(NativeLongByReference nPort);boolean PlayM4_OpenStream(NativeLong nPort, ByteByReference pFileHeadBuf, int nSize, intnBufPoolSize);boolean PlayM4_InputData(NativeLong nPort, ByteByReference pBuf, intnSize);booleanPlayM4_CloseStream(NativeLong nPort);boolean PlayM4_SetStreamOpenMode(NativeLong nPort, intnMode);booleanPlayM4_Play(NativeLong nPort, HWND hWnd);booleanPlayM4_Stop(NativeLong nPort);booleanPlayM4_SetSecretKey(NativeLong nPort, NativeLong lKeyType, String pSecretKey, NativeLong lKeyLen);//20140501, cuizhenfu@gmail.com

booleanPlayM4_SetDecCallBack(NativeLong nPort, DecCallBack decCallBack);booleanPlayM4_SetDecCallBackEx(NativeLong nPort, DecCallBack decCallBack, String pDest, NativeLong nDestSize);public static interface DecCallBack extendsStdCallCallback {public voidinvoke(NativeLong nPort, ByteByReference pBuffer, NativeLong nSize, FRAME_INFO frameInfo, NativeLong nReserved1, NativeLong nReserved2);

}public static class FRAME_INFO extendsStructure {public NativeLong nWidth; /*画面宽,单位像素。如果是音频数据,则为音频声道数*/

public NativeLong nHeight; /*画面高,单位像素。如果是音频数据,则为样位率*/

public NativeLong nStamp; /*时标信息,单位毫秒*/

public NativeLong nType; /*数据类型,T_AUDIO16, T_RGB32, T_YV12*/

public NativeLong nFrameRate; /*编码时产生的图像帧率,如果是音频数据则为采样率*/

public int dwFrameNum; /*帧号*/}

}

69c5a8ac3fa60e0848d784a6dd461da6.png

解码显示和解码不显示可在下面段代码切换

69c5a8ac3fa60e0848d784a6dd461da6.png// //设置解码回调函数 只解码不显示//if (!playControl.PlayM4_SetDecCallBack(m_lPort.getValue(), decCallBack))//{//break;//}//设置解码回调函数 解码且显示

if (!playControl.PlayM4_SetDecCallBackEx(m_lPort.getValue(), decCallBack, null, null))

{break;

}

69c5a8ac3fa60e0848d784a6dd461da6.png

如果不显示的话,则不需要窗口句柄,这句可以去掉

69c5a8ac3fa60e0848d784a6dd461da6.pngW32API.HWND hwnd = new W32API.HWND(Native.getComponentPointer(panelRealplay));

69c5a8ac3fa60e0848d784a6dd461da6.png

然后再播放的时候第二个参数传null

69c5a8ac3fa60e0848d784a6dd461da6.pngif (!playControl.PlayM4_Play(m_lPort.getValue(), null)) //播放开始

{break;

}

69c5a8ac3fa60e0848d784a6dd461da6.png

这样就可以做到只解码,不显示。

——————————————————————————————————————————————————

这样在回调函数中可以得到视音频数据,其中视频数据是YV12格式的,音频数据是PCM格式的。

参考了海康SDK——》Demo示例——》MFC分功能示例——》2-

实时流回调解码获取YUV,主要是DecCallBack_DemoDlg.cpp文件。

——————————————————————————————————————————————————

调用JavaCV对海康h.264视频流解码还没有成功。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐