16,470
社区成员
发帖
与我相关
我的任务
分享
想实现的功能:接收并播放IP摄相机传回的MJPEG网络视频流;
使用VLC软件输入:IP地址:端口/videostream.asf?resolution=8&rate=15,
(Snifffer抓包返回 401未认证)
然后跳出一个对话框,输入用户名admin,密码为空,就可以播放视频
(Snifffer抓包返回 200 OK, 开始接收视频数据包)
用下面的代码,执行到 pIPicture->get_Width(&hmWidth);
出现异常,是否需要模拟发数据包,让服务器开始传视频数据包呢?
现在服务器还没开始传视频数据包。。。
char url[1000] = "IP地址:端口/videostream.asf?resolution=8&rate=15";
能否加用户名和密码参数呢?
#define datasize 1024*50
void CIPVideoDlg::OnButton4()
{
char url[1000] = "IP地址:端口/videostream.asf?resolution=8&rate=15";
unsigned char *buffer=new BYTE[datasize];
DWORD bytes_read;
HINTERNET internet= InternetOpen("HTTP Downloader",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL, NULL);
if( !internet )
return ;
HINTERNET file_handle = InternetOpenUrl(internet, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);
if( !file_handle)
return ;
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,datasize);
//void *pImageMemory=GlobalLock(buffer);
void *pImageMemory;
IStream *pIStream; //创建一个IStream接口指针,用来保存图片流
IPicture *pIPicture; //创建一个IPicture接口指针,表示图片对象
if(hGlobal!=NULL)
{
if((pImageMemory=GlobalLock(hGlobal))!=NULL)
{
GlobalUnlock(hGlobal);
//用全局内存初使化IStream接口指针
CreateStreamOnHGlobal(pImageMemory, false, &pIStream);
}
}
BOOL b = InternetReadFile(file_handle,pImageMemory,datasize,&bytes_read);
GlobalUnlock(pImageMemory); //解锁内存
if(!b)
return;
CDC* pDC = GetDlgItem(IDC_ShowImg) ->GetDC();
HDC hDC = pDC ->GetSafeHdc();
CRect rect;
GetDlgItem(IDC_ShowImg) ->GetClientRect( &rect );
OleLoadPicture(pIStream, 0, FALSE, IID_IPicture, (LPVOID*)&(pIPicture));
//用OleLoadPicture获得IPicture接
long hmWidth;
long hmHeight;
//执行到这里出现异常。。。。
pIPicture->get_Width(&hmWidth); //用接口方法获得图片的宽和高
pIPicture->get_Height(&hmHeight);
pIPicture->Render(hDC,0,0,640,480,0,hmHeight,hmWidth,-hmHeight,NULL);
//HANDLE hFile =CreateFile(_T(file_handle), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
// buffer[bytes_read]=0;
// delete []buffer;
GlobalFree(pImageMemory); //释放全局内存
pIStream->Release(); //释放pIStream
pIPicture->Release(); //释放pIPicture
InternetCloseHandle(internet);
}