设备网络SDK开发使用手册

NET_DVR_SetRealDataCallBack

注册回调函数,捕获实时码流数据。

BOOL NET_DVR_SetRealDataCallBack(
  LONG                 lRealHandle,
  fRealDataCallBack    cbRealDataCallBack,
  DWORD                dwUser
);

Parameters

lRealHandle
[in] NET_DVR_RealPlay或NET_DVR_RealPlay_V30的返回值
cbRealDataCallBack
[in] 码流数据回调函数
dwUser
[in] 用户数据

Callback Function

typedef void(CALLBACK *fRealDataCallBack)(
  LONG      lRealHandle,
  DWORD     dwDataType,
  BYTE      *pBuffer,
  DWORD     dwBufSize,
  DWORD     dwUser
);

Callback Function Parameters

lRealHandle
[out] 当前的预览句柄
dwDataType
[out] 数据类型
宏定义 宏定义值 含义
NET_DVR_SYSHEAD 1 系统头数据
NET_DVR_STREAMDATA 2 流数据(包括复合流或音视频分开的视频流数据)
NET_DVR_AUDIOSTREAMDATA 3 音频数据
NET_DVR_PRIVATE_DATA 112 私有数据,包括智能信息
pBuffer
[out] 存放数据的缓冲区指针
dwBufSize
[out] 缓冲区大小
dwUser
[out] 用户数据

Return Values

TRUE表示成功,FALSE表示失败。接口返回失败请调用NET_DVR_GetLastError获取错误码,通过错误码判断出错原因。

Remarks

  • cbRealDataCallBack回调函数中不能执行可能会占用时间较长的接口或操作,不建议调用该SDK(HCNetSDK.dll)本身的接口。
  • 此函数包括开始和停止用户处理SDK捕获的数据,当回调函数cbRealDataCallBack设为非NULL值时,表示回调和处理数据;当设为NULL时表示停止回调和处理数据。回调的第一个包是40个字节的文件头,供后续解码使用,之后回调的是压缩的码流。回调数据最大为256K字节。
  • Example

    由用户自行处理回调得到的码流数据,此处以软解显示为例,代码中带有PlayM4_的函数参见播放库SDK开发包里面的《播放器SDK编程指南》

    #include <stdio.h>
    #include <iostream>
    #include <time.h>
    #include "plaympeg4.h"
    using namespace std;
    
    LONG lPort; //全局的播放库port号
    
    void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,DWORD dwUser)
    {
        HWND hWnd = GetConsoleWindow();
    
    	switch (dwDataType)
    	{
    	case NET_DVR_SYSHEAD: //系统头
    
    		if (!PlayM4_GetPort(&lPort))  //获取播放库未使用的通道号
    		{
    			break;
    		}
    		//m_iPort = lPort; //第一次回调的是系统头,将获取的播放库port号赋值给全局port,下次回调数据时即使用此port号播放
    		if (dwBufSize > 0)
    		{
    			if (!PlayM4_SetStreamOpenMode(lPort, STREAME_REALTIME))  //设置实时流播放模式
    			{
    				break;
    			}
    
    			if (!PlayM4_OpenStream(lPort, pBuffer, dwBufSize, 1024*1024)) //打开流接口
    			{
    				break;
    			}
    
    			if (!PlayM4_Play(lPort, hWnd)) //播放开始
    			{
    				break;
    			}
    		}
    	case NET_DVR_STREAMDATA:   //码流数据
    		if (dwBufSize > 0 && lPort != -1)
    		{
    			if (!PlayM4_InputData(lPort, pBuffer, dwBufSize))
    			{
    				break;
    			} 
    		}
    	}
    }
    
    void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
    {
        char tempbuf[256] = {0};
        switch(dwType) 
        {
        case EXCEPTION_RECONNECT:    //预览时重连
        printf("----------reconnect--------%d\n", time(NULL));
        break;
    	default:
        break;
        }
    }
    
    void main() {
    
      //---------------------------------------
      // 初始化
      NET_DVR_Init();
      
      //---------------------------------------
      // 注册设备
      LONG lUserID;
      NET_DVR_DEVICEINFO_V30 struDeviceInfo;
      lUserID = NET_DVR_Login_V30("172.0.0.100", 8000, "admin", "12345", &struDeviceInfo);
      if (lUserID < 0)
      {
           printf("Login error, %d\n", NET_DVR_GetLastError());
           NET_DVR_Cleanup();
           return;
      }
    
      //---------------------------------------
      //设置异常消息回调函数
      NET_DVR_SetExceptionCallBack_V30(0, NULL,g_ExceptionCallBack, NULL);
    
      //---------------------------------------
      //启动预览并设置回调数据流
      LONG lRealPlayHandle;
      NET_DVR_CLIENTINFO ClientInfo = {0};
      ClientInfo.hPlayWnd = NULL;         //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空
      ClientInfo.lChannel     = 1;       //预览通道号
      ClientInfo.lLinkMode    = 0;       //最高位(31)为0表示主码流,为1表示子码流0~30位表示连接方式:0-TCP方式;1-UDP方式;2-多播方式;3-RTP方式;
      ClientInfo.sMultiCastIP = NULL;   //多播地址,需要多播预览时配置
      
      BOOL bPreviewBlock = false;       //请求码流过程是否阻塞,0:否,1:是
      lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, NULL, NULL, 0);
    
      if (lRealPlayHandle < 0)
      {
          printf("NET_DVR_RealPlay_V30 error\n");
    	  NET_DVR_Logout(lUserID);
          NET_DVR_Cleanup();
          return;
      }
    
      if (!NET_DVR_SetRealDataCallBack(lRealPlayHandle, g_RealDataCallBack_V30, 0))
      {
          printf("NET_DVR_SetRealDataCallBack error\n");
      }
      
      //---------------------------------------
      //关闭预览
      NET_DVR_StopRealPlay(lRealPlayHandle);
      //注销用户
      NET_DVR_Logout_V30(lUserID);
      NET_DVR_Cleanup();
    
      return;
    }
    

    See Also

    NET_DVR_RealPlay  NET_DVR_RealPlay_V30