当时弄这个问题的时候 搞得很头疼,网上的回答很多单数不全面,测试总有问题 所以我打算系统的讲解一下:保证你跟着步奏走就成功,方法不是很好
但是思路基本可以,有好的意见希望指教:
1 我用到了WinInet 编程 至于他是什么东西:友情链接 http://blog.csdn.net/asce1885/article/details/5713668
2如何在MFC控件上显示jpg格式的图片 :了解下这 IPicture *pIPicture;//创建一个IPicture接口指针,表示图片对象
3当你似懂非懂了WinInet 和 IPicture 就可以上代码了
//3个参数:1 视频URL(注意这是http的) 2播放器的窗口(我用的是图片控件的句柄)3控件大小
HRESULT Vidiolayer(CString lpstrImgUrl,HWND hWnd,CRect theRect)
{
const int dwBufSize = 1024; //接受的每次的字节数
CInternetSession * Session = new CInternetSession; //你懂的}
//到这里其实你已经实现了将远地视频变成本地的一张张图片 但是我们要播放所以要马上一张张的显示到图片控件上
//这个方法有点差,他是经过合成本地再从本地拉出来:希望哪位大神 能给个方法直接将获得的数据展示到图片控件上
//望赐教
//下面就是如何显示图片了 关键问题:MFC如何显示jpg格式的图片
//大体思路是通过数据流通过IPicture
//注意:HDC hDC=GetDC(hWnd); GetDC()在类的成员函数里面用属于USER.h 里面的 返回CDC*
//在全局函数里面才返回 HDC 切记注意 他在不同的地方代表的身份不一样
//下面的代码直接和上面连起来
HDC hDC=GetDC(hWnd);
HANDLE hFile=CreateFile("1.jpg", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //从指定的路径szImagePath中读取文件句柄
DWORD dwFileSize=GetFileSize(hFile, NULL); //获得图片文件的大小,用来分配全局内存
HGLOBAL hImageMemory=GlobalAlloc(GMEM_MOVEABLE, dwFileSize); //给图片分配全局内存
void *pImageMemory=GlobalLock(hImageMemory); //锁定内存
DWORD dwReadedSize; //保存实际读取的文件大小
ReadFile(hFile, pImageMemory, dwFileSize, &dwReadedSize, NULL); //读取图片到全局内存当中
GlobalUnlock(hImageMemory); //解锁内存
CloseHandle(hFile); //关闭文件句柄
IStream *pIStream;//创建一个IStream接口指针,用来保存图片流
IPicture *pIPicture;//创建一个IPicture接口指针,表示图片对象
CreateStreamOnHGlobal(hImageMemory, false, &pIStream); //用全局内存初使化IStream接口指针
OleLoadPicture(pIStream, 0, false, IID_IPicture, (LPVOID*)&(pIPicture));//用OleLoadPicture获得IPicture接口指针
//得到IPicture COM接口对象后,你就可以进行获得图片信息、显示图片等操作
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pIPicture->get_Width(&hmWidth); //用接口方法获得图片的宽和高
pIPicture->get_Height(&hmHeight);
pIPicture->Render(hDC,0,0,theRect.Width(),theRect.Height(),0,hmHeight,hmWidth,-hmHeight,NULL); //在指定的DC上绘出图片
GlobalFree(hImageMemory); //释放全局内存
pIStream->Release(); //释放pIStream
pIPicture->Release(); //释放pIPicture
return 0;
}
//上面的函数只是将单张的图片显示到MFC上 要达到视频效果 要调用定时器 让定时器不断的调用此函数
void CVidioTestDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默NULL认值
CWnd* wnd = GetDlgItem(IDC_STATIC_PIC);
CRect rect;
wnd->GetClientRect(&rect);
::ShowPic("",wnd->GetSafeHwnd(), rect);
CDialogEx::OnTimer(nIDEvent);
}
//最后提示:我的这个视频是实施播放的,就是他是一个监控摄像头 其他的静态视频文件 不知道行不行 希望哪位大神能 教我如何远程播放静态视频文件
//当然大家不嫌麻烦可以用DricShow :http://blog.csdn.net/zhang2012liang/article/details/8716717