16,473
社区成员
发帖
与我相关
我的任务
分享
///实时流回调函数
void CALLBACK fRealDataCallBack(LONG lRealHandle,DWORD dwDataType,BYTE *pBuffer,DWORD dwBufSize,void *pUser)
{
DWORD dRet;
switch (dwDataType)
{
case NET_DVR_SYSHEAD:
if (!PlayM4_GetPort(&nPort))
{
break;
}
if (!PlayM4_OpenStream(nPort,pBuffer,dwBufSize,1024*1024))
{
dRet=PlayM4_GetLastError(nPort);
break;
}
//设置解码回调函数 只解码不显示
// if (!PlayM4_SetDecCallBack(nPort,DecCBFun))
// {
// dRet=PlayM4_GetLastError(nPort);
// break;
// }
//设置解码回调函数 解码且显示
if (!PlayM4_SetDecCallBackEx(nPort,DecCBFun,NULL,NULL))
{
dRet=PlayM4_GetLastError(nPort);
break;
}
//打开视频解码
if (!PlayM4_Play(nPort,hPlayWnd))
{
dRet=PlayM4_GetLastError(nPort);
break;
}
//打开音频解码, 需要码流是复合流
if (!PlayM4_PlaySound(nPort))
{
dRet=PlayM4_GetLastError(nPort);
break;
}
break;
case NET_DVR_STREAMDATA:
BOOL inData=PlayM4_InputData(nPort,pBuffer,dwBufSize);
while (!inData)
{
Sleep(10);
inData=PlayM4_InputData(nPort,pBuffer,dwBufSize);
OutputDebugString("PlayM4_InputData failed \n");
}
}
}
//取流
void CDecCallBack_DemoDlg::OnOK()
{
// TODO: Add extra validation here
BOOL bRet1;
UpdateData(TRUE);
if (llRealHandle<0)
{
UpdateData(TRUE);
if (lUserID<0)
{
ErrorNum.Format("Login failed Error number :%d\n",NET_DVR_GetLastError());
OutputDebugString(ErrorNum);
}
//////////////////////////////////////////////////////////////////////////
NET_DVR_CLIENTINFO ClientInfo;
ClientInfo.lChannel = iPChannel; //Channel number 设备通道号
ClientInfo.hPlayWnd = NULL; //窗口为空,设备SDK不解码只取流
ClientInfo.lLinkMode = 0; //Main Stream
ClientInfo.sMultiCastIP = NULL;
//预览取流
llRealHandle = NET_DVR_RealPlay_V30(lUserID,&ClientInfo,fRealDataCallBack,NULL,TRUE);
if (llRealHandle<0)
{
ErrorNum.Format("NET_DVR_RealPlay_V30 failed! Error number: %d\n",NET_DVR_GetLastError());
AfxMessageBox(ErrorNum);
return;
}
// else
// {
// DWORD dwTmp;
// HANDLE hfile = CreateFile("D:\\aaa.mp4", GENERIC_WRITE, 0, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// WriteFile(hfile,fRealDataCallBack,_tcslen((LPCTSTR)fRealDataCallBack)*sizeof(TCHAR),&dwTmp,NULL);
// CloseHandle(hfile);
// }
GetDlgItem(IDOK)->SetWindowText("Stop");
}
else
{
//停止预览
if (NET_DVR_StopRealPlay(llRealHandle))
{
bRet1=NET_DVR_GetLastError();
}
llRealHandle=-1;
//停止解码
if (nPort>-1)
{
if (!PlayM4_StopSound())
{
bRet1=PlayM4_GetLastError(nPort);
}
if (!PlayM4_Stop(nPort))
{
bRet1=PlayM4_GetLastError(nPort);
}
if (!PlayM4_CloseStream(nPort))
{
bRet1=PlayM4_GetLastError(nPort);
}
PlayM4_FreePort(nPort);
nPort=-1;
}
//关闭保存解码后数据的音视频文件
if (Audiofile!=NULL)
{
fclose(Audiofile);
Audiofile=NULL;
}
if (Videofile!=NULL)
{
fclose(Videofile);
Videofile=NULL;
}
GetDlgItem(IDOK)->SetWindowText("Start Play");
}
UpdateData(FALSE);
// CDialog::OnOK();
}
void CDecCallBack_DemoDlg::OnButton2()
{
// TODO: Add your control notification handler code here
DWORD dwTmp=0;
HANDLE hfile = CreateFile("D:\\aaa.mp4", GENERIC_WRITE, 0, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hfile,fRealDataCallBack,_tcslen((LPCTSTR)fRealDataCallBack)*sizeof(TCHAR),&dwTmp,NULL);
CloseHandle(hfile);
}