LRESULT CRevPlayWnd::OnRead(WPARAM wParam,LPARAM lParam)
{
DWORD dwRet;
REFTIME fTime;
REFERENCE_TIME llClock;
HRESULT hr;
RECT rect;
//接收组播数据,存放到缓冲区stWSABuf中
RevLen=ReceiveData();
//将缓冲区stWSABuf中的数据拷贝到存放接收的数据的数组pRevMem中,
//以供DirectShow读取
CopyMemory((PVOID)pRevMem[rIndex],(PVOID)stWSABuf.buf,RevLen);
rIndex=(rIndex+1)%100;
//将接收到的数据保存到文件中
if(hmmioSave)
mmioWrite(hmmioSave,stWSABuf.buf,RevLen);
if(m_FirstRead)
{//如果是第一次接收到数据,启动DirectShow
fTime = 0.0;
dwRet = Parse ((PBYTE)stWSABuf.buf, stWSABuf.len, &llClock);
fTime = llClock / 90000.0;
if(dwRet == 0)
return -1;
if(InitGraph()==-1)
return -1;
if (abs (dwRet - 2048000) <= 16000) {
RenderFrom ((PBYTE)achInBuf, "2mpal.dat");
}
if (abs (dwRet - 1152000) <= 16000) {
RenderFrom ((PBYTE)achInBuf, "1mpal.dat");
}
if (abs (dwRet - 512000) <= 16000) {
RenderFrom ((PBYTE)achInBuf, "512pal.dat");
}
if (abs (dwRet - 256000) <= 16000) {
RenderFrom ((PBYTE)achInBuf, "256pal.dat");
}
Block = 0;
//使用智能连接,将Source Filter的输出Pin连出去
if (FAILED(hr = m_pigb -> Render(m_rdr -> GetPin(0))))
{
if (hr != VFW_S_AUDIO_NOT_RENDERED && hr != VFW_E_NO_AUDIO_HARDWARE )
{
MessageBox ("Render Error");
WSAAsyncSelect(MultiSock,m_hWnd,WSA_READ,0);
HELPER_RELEASE(m_pifg);
HELPER_RELEASE(m_pigb);
HELPER_RELEASE(m_pimc);
HELPER_RELEASE(m_pivw);
HELPER_RELEASE(m_ppos);
return -1;
}
}
m_RenderOk = true;
//设置视频窗口属性
m_pivw -> put_Owner((OAHWND)m_hWnd);
m_pivw -> put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
GetClientRect(&rect);
m_pivw -> SetWindowPosition(rect.left, rect.top, rect.right, rect.bottom);
//开始播放
m_pimc -> Run();
m_ppos->put_CurrentPosition(fTime + 0.4);
m_Stop = TRUE;
}
m_FirstRead=FALSE;
return 0;
}
C++远程监控系统接收端- RevPlayMDIChildWnd.cpp
最新推荐文章于 2024-10-31 20:10:41 发布
该代码段是处理接收组播数据并进行DirectShow播放的函数。首先,它接收数据并将其存储到缓冲区,然后将数据拷贝到DirectShow可读取的内存区域。如果这是第一次接收数据,它会初始化图形设备接口并尝试根据接收到的数据大小渲染不同格式的文件。最后,它设置视频窗口属性并开始播放。在处理错误时,它会释放相关资源并显示错误消息。
摘要由CSDN通过智能技术生成