xiongmai那个鬼东西,通道号的玄幻的地方

516 阅读2分钟

仅从播放的步骤看,通道号跟3个函数相关
或许这么认识,用通道号来标识播放的窗口(句柄)
将通道号初始化,并关联到相应相机(ip不同为不同相机) 总共需要三步,(仅是初始化,播放也要以通道号为准,真是鬼东西)

  • ip关联到播放通道号主要表现在下面函数
    long m_iPlayhandle = H264_DVR_RealPlay(lLoginID, &playstru);	//打开实时预览
    H264_DVR_SetRealDataCallBack(m_iPlayhandle, RealDataCallBack, (long)this);
  • 完整演示登录到播放的示例
  • 雄迈开发人员设计的时候把登录句柄(id)和播放句柄应该设计成一样的,至少调试时发现这种逻辑
  • 很扯! 如果我要想截图,那么必须实现RealDataCallBack回调,并在里面调用H264_PLAY_InputData 因为这个才是解码的函数,用它解了码,其他地方才能调用H264_PLAY_CatchPic xiongmai垃圾
const uint16_t play_port = 10;  
int __stdcall RealDataCallBack(long lRealHandle,
	long dwDataType, unsigned char* pBuffer,
	long lbufsize, long dwUser)
{
	//CVideoWnd* pDataChnl = (CVideoWnd*)dwUser;
	H264_PLAY_InputData(play_port, pBuffer, lbufsize);
	return 1;
}  

// 拿到YV12数据,经api保存成jpg
void __stdcall displayCalBack(LONG nPort, LPCSTR pBuf, LONG nSize, LONG nWidth, LONG nHeight, LONG nStamp, LONG nType, LONG nUser)
{
	static uint16_t cnt = 0;
	string file_name{ "./" };
	file_name.append(to_string(cnt));
	file_name.append(".jpeg");
	++cnt;
	cout << "file_name" << file_name << endl;
	H264_PLAY_CatchPic(play_port, const_cast<char*>(file_name.c_str()));  
}  

void CxiongApiTestDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	H264_DVR_SetConnectTime(3000, 1);
	string ip = "192.168.0.175"; 
	unsigned short DVRPort = 34567;
	string UserName = "admin";
	string Password = "";
	H264_DVR_DEVICEINFO OutDev;
	int nError = 0;
	long lLoginID = 0;
	lLoginID = H264_DVR_Login((char*)ip.c_str(), DVRPort, (char*)UserName.c_str(),            //登陆设备
		(char*)Password.c_str(), &OutDev, &nError);
	HWND hWnd= GetDlgItem(IDC_PlayWnd)->GetSafeHwnd();
	hWnd = nullptr;
	BYTE byFileHeadBuf;
	BOOL ret;
	ret = H264_PLAY_OpenStream(play_port, &byFileHeadBuf,1, SOURCE_BUF_MIN * 50);
	//H264_PLAY_SetStreamOpenMode(0, STREAME_REALTIME);
	ret = H264_PLAY_SetDisplayCallBack(play_port, displayCalBack, (LONG)this);  //设置视频解码回调
	// ret = H264_PLAY_SetDecCallBack(play_port, decodeCallBack);
	ret = H264_PLAY_Play(play_port, hWnd);

	H264_DVR_CLIENTINFO playstru;
	playstru.nChannel = 0;
	playstru.nStream = 0;
	playstru.nMode = 0;

	int errNum = 0;	
	long m_iPlayhandle = H264_DVR_RealPlay(lLoginID, &playstru);	//打开实时预览  	
	cout << "------------lLoginID:" << lLoginID << endl;
	cout << "------------m_iPlayhandle:" << m_iPlayhandle << endl;
	H264_DVR_SetRealDataCallBack(m_iPlayhandle, RealDataCallBack, (long)this);

	//CDialogEx::OnOK();
}