仅从播放的步骤看,通道号跟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_CatchPicxiongmai垃圾
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();
}