📄 netsdkdemodlg.cpp
字号:
if (!ret)
{
MessageBox("error while getting split info");
return;
}
m_saveDataPannel.SetCheckReal(siNode.isSaveData);
m_saveDataPannel.SetCheckRaw(siNode.SavecbFileRaw ? 1 : 0);
m_saveDataPannel.SetCheckStd(siNode.SavecbFileStd ? 1 : 0);
m_saveDataPannel.SetCheckYuv(siNode.SavecbFileYUV ? 1 : 0);
m_saveDataPannel.SetCheckPcm(siNode.SavecbFilePcm ? 1 : 0);
m_advanceBtnPannel.SetCheckSound(m_curSoundSplit == m_curScreen ? 1 : 0);
//更新视频参数项
UpdateVideoCtrl(VIDEO_TOTAL);
/*
if (siNode.Type == SPLIT_TYPE_MONITOR &&
((SplitMonitorParam *)siNode.Param)->isTalkOpen)
{
m_advanceBtnPannel.SetCheckTalk(1);
}
else
{
m_advanceBtnPannel.SetCheckTalk(0);
}
*/
}
//刷新视频参数控制区,nMode 0~3对应单项刷新
void CNetSDKDemoDlg::UpdateVideoCtrl(int nMode)
{
SplitInfoNode siNode;
memset(&siNode, 0, sizeof(siNode));
BOOL ret = GetSplitInfo_Main(m_curScreen, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
return;
}
BYTE bVideo[4];
memset(bVideo,0, 4);
if(siNode.Type == SPLIT_TYPE_MONITOR)
{
memcpy(bVideo, siNode.nVideoParam.bParam, 4);
BOOL nRet = CLIENT_ClientSetVideoEffect(siNode.iHandle,
bVideo[0], bVideo[1], bVideo[2], bVideo[3]);
if (!nRet)
{
LastError();
}
}
if (nMode == VIDEO_TOTAL)
{
for (int i = 0; i < VIDEO_TOTAL; i++)
{
m_colorPannel.UpdateVideoDisplay(i, bVideo[i]);
}
}
else
{
m_colorPannel.UpdateVideoDisplay(nMode, bVideo[nMode]);
}
}
/////////////for one////////////////
DWORD GetMonthDays(const DWORD& dwYear, const DWORD& dwMonth)
{
DWORD dwMDays = 0;
switch(dwMonth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
dwMDays = 31;
break;
case 2:
{
if (((dwYear%4==0)&& dwYear%100) || (dwYear%400==0))
{
dwMDays = 29;
}
else
{
dwMDays = 28;
}
}
break;
case 4:
case 6:
case 9:
case 11:
dwMDays = 30;
break;
default:
break;
}
return dwMDays;
}
/*
* can't surpport year offset time
*/
NET_TIME GetSeekTimeByOffsetTime(const NET_TIME& bgtime, unsigned int offsettime)
{
NET_TIME tmseek;
memset(&tmseek, 0x00, sizeof(NET_TIME));
DWORD dwNext = 0;
//second
tmseek.dwSecond = (bgtime.dwSecond+offsettime)%60;
dwNext = (bgtime.dwSecond+offsettime)/60;
//minute
tmseek.dwMinute = (dwNext+bgtime.dwMinute)%60;
dwNext = (dwNext+bgtime.dwMinute)/60;
//hour
tmseek.dwHour = (dwNext+bgtime.dwHour)%24;
dwNext = (dwNext+bgtime.dwHour)/24;
DWORD dwMDays = GetMonthDays(bgtime.dwYear, bgtime.dwMonth);
//day
tmseek.dwDay = (dwNext+bgtime.dwDay)%dwMDays;
dwNext = (dwNext+bgtime.dwDay)/dwMDays;
//month
tmseek.dwMonth = (dwNext+bgtime.dwMonth)%12;
dwNext = (dwNext+bgtime.dwMonth)/12;
tmseek.dwYear = dwNext+bgtime.dwYear;
return tmseek;
}
/*
* can't surpport year offset time
*/
DWORD GetOffsetTime(const NET_TIME& st, const NET_TIME& et)
{
DWORD dwRet = -1;
if (et.dwYear != st.dwYear)
{
return dwRet;
}
DWORD dwDays = 0;
for(int i=st.dwMonth+1; i < et.dwMonth; ++i)
{
dwDays += GetMonthDays(st.dwYear, i);
}
if (et.dwMonth == st.dwMonth)
{
dwDays +=et.dwDay - st.dwDay;
}
else
{
dwDays += et.dwDay;
dwDays += GetMonthDays(st.dwYear, st.dwMonth) - st.dwDay;
}
dwRet = dwDays*24*60*60 + ((int)et.dwHour - (int)st.dwHour)*60*60 +
((int)et.dwMinute - (int)st.dwMinute)*60 + (int)et.dwSecond - (int)st.dwSecond;
return dwRet;
}
/////////////for one////////////////
//播放进度条拖动的处理
BOOL CNetSDKDemoDlg::SeekPlayPositon(int nPos)
//void CNetSDKDemoDlg::OnReleasedcapturePlayPosition(NMHDR* pNMHDR, LRESULT* pResult)
{
SplitInfoNode siNode;
memset(&siNode, 0, sizeof(siNode));
BOOL ret = GetSplitInfo_Main(m_curScreen, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
return FALSE;
}
ret = FALSE;
if(siNode.Type == SPLIT_TYPE_NETPLAY)
{
SplitNetPlayParam * pbParam = (SplitNetPlayParam *)siNode.Param;
if (pbParam->iStatus == STATUS_PAUSE)
{
return FALSE;
}
pbParam->iPlayPos = nPos;
DWORD total = pbParam->pFileInfo->fileinfo.size;
ret = CLIENT_SeekPlayBack(siNode.iHandle, 0xFFFFFFFF, nPos * total /100);
if (!ret)
{
LastError();
}
}
else if (siNode.Type == SPLIT_TYPE_PBBYTIME)
{
SplitPBByTimeParam * pbParam = (SplitPBByTimeParam *)siNode.Param;
if (pbParam->iStatus == STATUS_PAUSE)
{
return FALSE;
}
pbParam->npos = nPos;
//DWORD time = g_IntervalTime(&pbParam->starttime, &pbParam->endtime);
DWORD time = GetOffsetTime(pbParam->starttime, pbParam->endtime);
BOOL ret = CLIENT_SeekPlayBack(siNode.iHandle, nPos * time /100, 0xFFFFFFFF);
if (!ret)
{
LastError();
}
}
return ret;
// *pResult = 0;
}
////////////////////////////////////////////功能操作//////////////////////////////////////////////
//增加设备连接项
void CNetSDKDemoDlg::AddDevice()
{
AddDeviceDlg dlg;
if(dlg.DoModal() == IDOK)
{
UpdateDeviceList(); //刷新设备列表显示
}
// TODO: Add your control notification handler code here
}
//实时数据回调,用于计算码流统计和保存数据
void CALLBACK RealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, DWORD dwUser)
{
if(dwUser == 0)
{
return;
}
CNetSDKDemoDlg *dlg = (CNetSDKDemoDlg *)dwUser;
dlg ->ReceiveRealData(lRealHandle,dwDataType, pBuffer, dwBufSize);
}
//回放数据回调函数,demo里将数据保存成文件
int CALLBACK PBDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, DWORD dwUser)
{
if(dwUser == 0)
{
return -1;
}
CNetSDKDemoDlg *dlg = (CNetSDKDemoDlg *)dwUser;
dlg ->ReceiveRealData(lRealHandle,dwDataType, pBuffer, dwBufSize);
return 1;
}
void CALLBACK RealDataCallBackEx(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize, LONG lParam, DWORD dwUser)
{
if(dwUser == 0)
{
return;
}
CNetSDKDemoDlg *dlg = (CNetSDKDemoDlg *)dwUser;
dlg->ReceiveRealData(lRealHandle,dwDataType, pBuffer, dwBufSize);
}
//根据设备列表取得设备Id,根据通道选择通道号
void CNetSDKDemoDlg::OpenChannel()
{
HTREEITEM node_dev, tmpnode;
DWORD nItem;
CString strCh;
DeviceNode *pInfo;
tmpnode = m_devicelist.GetSelectedItem();
if(!tmpnode)
{
MessageBox(MSG_DEMODLG_CHECKSEL);
return;
}
RealPlayType subtype;
int subidx = m_normalBtnPannel.GetSubType();
switch(subidx)
{
case 0:
subtype = RType_Realplay_0;
break;
case 1:
subtype = RType_Realplay_1;
break;
case 2:
subtype = RType_Realplay_2;
break;
case 3:
subtype = RType_Realplay_3;
break;
default:
subtype = RType_Realplay_0;
}
nItem = m_devicelist.GetItemData(tmpnode);
if(nItem < 16) //是通道项
{
node_dev = m_devicelist.GetParentItem(tmpnode);
pInfo = (DeviceNode *)m_devicelist.GetItemData(node_dev);
OpenSingleChannel(pInfo, nItem, m_curScreen, subtype);
}
else //设备项
{
OpenAllChannel((DeviceNode *)nItem, subtype);
}
}
void CNetSDKDemoDlg::OpenSingleChannel(DeviceNode *pInfo, int nCh, int screenNo, RealPlayType subtype)
{
//查询是否被列入轮循列表
if (IsCycling((DWORD)pInfo, nCh))
{
MessageBox(MSG_DEMODLG_ERROR_CYCLING);
return;
}
//关闭当前窗口的播放
ProcessCloseScreen(screenNo);
CWnd* pWnd = m_screenPannel.GetPage(screenNo);
if (!pWnd)
{
return ;
}
LONG nID = pInfo->LoginID;
LONG nChannelID;
// nChannelID = CLIENT_RealPlay(nID, nCh, GetDlgItem(IDC_SCREEN1 + m_curScreen )->m_hWnd);
nChannelID = CLIENT_RealPlayEx(nID, nCh, pWnd->m_hWnd/*m_playWnd[screenNo].m_hWnd*/, subtype);
if(!nChannelID)
{
LastError();
MessageBox(MSG_DEMODLG_OPENCHLFAILED);
return;
}
//获取视频参数
BYTE bVideo[4];
BOOL nRet = CLIENT_ClientGetVideoEffect(nChannelID, &bVideo[0],&bVideo[1],&bVideo[2],&bVideo[3]);
if (!nRet)
{
LastError();
}
SplitInfoNode siNode;
memset(&siNode, 0, sizeof(siNode));
BOOL ret = GetSplitInfo_Main(screenNo, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
}
siNode.Type = SPLIT_TYPE_MONITOR;
siNode.nVideoParam.dwParam = *(DWORD *)bVideo;
siNode.iHandle = nChannelID;
SplitMonitorParam *mparam = new SplitMonitorParam;
mparam->pDevice = pInfo;
mparam->iChannel = nCh;
siNode.Param = mparam;
ret = SetSplitInfo_Main(screenNo, &siNode);
if (!ret)
{
MessageBox("error while setting split info");
}
//更新保存数据状态
if(siNode.isSaveData)
{
CString strName ;
strName.Format("savech%d.dav", nCh);
BOOL ret = CLIENT_SaveRealData(nChannelID, strName.GetBuffer(0));
if(!ret)
{
LastError();
MessageBox(MSG_DEMODLG_SAVEDATAFAILED);
}
}
UpdateCurScreenInfo();
//更新音频
if(m_curSoundSplit == screenNo)
{
BOOL nRet = CLIENT_OpenSound(nChannelID);
if (!nRet)
{
LastError();
}
}
//设置数据回调
// BOOL cbRec = CLIENT_SetRealDataCallBack(nChannelID, RealDataCallBack, (DWORD)this);
BOOL cbRec = CLIENT_SetRealDataCallBackEx(nChannelID, RealDataCallBackEx, (DWORD)this, 0x0000000f);
if (!cbRec)
{
LastError();
}
// BOOL bRet = CLIENT_DHPTZControl(nID,0, PTZ_UP_CONTROL, 2, 2,0, false);
// int iii = 0;
}
//接收播放进度状态处理
void CNetSDKDemoDlg::ReceivePlayPos(LONG lPlayHandle, DWORD dwTotalSize, DWORD dwDownLoadSize)
{
//取得窗口号
int nScreen = GetHandleSplit(lPlayHandle);
if(nScreen < 0)
{
return;
}
SplitInfoNode siNode;
memset(&siNode, 0, sizeof(siNode));
BOOL ret = GetSplitInfo_Main(nScreen, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
}
//更新播放进度值
if (siNode.Type == SPLIT_TYPE_NETPLAY)
{
SplitNetPlayParam *nParam = (SplitNetPlayParam *)siNode.Param;
if (nParam)
{
nParam->iPlayPos = dwDownLoadSize * 100 / dwTotalSize;
if (nParam->iPlayPos > 100)
{
int xyz = 0;
}
if(((int)dwDownLoadSize == -1) || (nParam->iPlayPos >= 100))
{
PlayStop(nScreen);
//m_playWnd[nScreen].ShowWindow(SW_HIDE);
//m_playWnd[nScreen].ShowWindow(SW_SHOW);
}
}
}
else if (siNode.Type == SPLIT_TYPE_PBBYTIME)
{
SplitPBByTimeParam *pbParam = (SplitPBByTimeParam *)siNode.Param;
if (pbParam)
{
pbParam->npos = dwDownLoadSize * 100 / dwTotalSize;
if(((int)dwDownLoadSize == -1) || (pbParam->npos >= 100))
{
PlayStop(nScreen);
}
}
}
}
//播放进度状态回调
void CALLBACK PlayCallBack(LONG lPlayHandle, DWORD dwTotalSize, DWORD dwDownLoadSize, DWORD dwUser)
{
if(dwUser == 0)
{
return;
}
CNetSDKDemoDlg *dlg = (CNetSDKDemoDlg *)dwUser;
dlg->ReceivePlayPos(lPlayHandle, dwTotalSize, dwDownLoadSize);
}
//录像查询
void CNetSDKDemoDlg::SearchRecord()
{
CSearchRecord dlg;
if(dlg.DoModal() == IDOK) //打开回放时
{
if (!dlg.m_playfile)
{
return;
}
if(!CheckCurSplitAndClose())
{
return;
}
PlayRecordFile(dlg.m_playfile, m_curScreen);
/*
if (!dlg.m_playList)
{
return;
}
else
{
for (int i = 0; i < dlg.m_playCount; i++)
{
PlayRecordFile(&dlg.m_playList[i], i);
}
}
*/
}
}
void CNetSDKDemoDlg::PlayRecordFile(FileInfoNode* playfile, int scrNo)
{
CWnd *plWnd = m_screenPannel.GetPage(scrNo);
if (!plWnd)
{
MessageBox("unexpected error!!!!");
return;
}
LONG lPlayHandle = CLIENT_PlayBackByRecordFileEx(playfile->pDevice->LoginID, &playfile->fileinfo,
plWnd->m_hWnd/*m_playWnd[m_curScreen].m_hWnd*/, PlayCallBack, (DWORD)this, PBDataCallBack, (DWORD)this);
// LONG lPlayHandle = CLIENT_PlayBackByRecordFile(playfile->pDevice->LoginID, &playfile->fileinfo,
// plWnd->m_hWnd/*m_playWnd[m_curScreen].m_hWnd*/, PlayCallBack, (DWORD)this);
if(!lPlayHandle)
{
LastError();
MessageBox(MSG_DEMODLG_PLAYFAILED);
return;
}
else
{ //如果其它通道没有打开音频,则打开音频
if (m_curSoundSplit < 0)
{
if (FALSE == CLIENT_OpenSound(lPlayHandle))
{
LastError();
MessageBox(MSG_OPENSOUNDFAILED);
m_advanceBtnPannel.SetCheckSound(0);
}
else
{
m_advanceBtnPannel.SetCheckSound(1);
m_curSoundSplit = scrNo;
}
}
}
SplitInfoNode siNode;
memset(&siNode, 0, sizeof(siNode));
BOOL ret = GetSplitInfo_Main(scrNo, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
}
siNode.Type = SPLIT_TYPE_NETPLAY;
siNode.iHandle = lPlayHandle;
SplitNetPlayParam *nParam = new SplitNetPlayParam;
nParam->pFileInfo = new FileInfoNode;
memcpy(nParam->pFileInfo, playfile, sizeof(FileInfoNode));
nParam->iPlayPos = 0;
nParam->iStatus = STATUS_PLAY;
siNode.Param = nParam;
ret = SetSplitInfo_Main(scrNo, &siNode);
if (!ret)
{
MessageBox("error while getting split info");
}
m_playctrlPannel.StartPlay();
UpdateCurScreenInfo();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -