MFC 通过一个视频URL 来播放视频 MFC IPicture 显示jpg格式图片
2013-08-14 23:20
549 查看
当时弄这个问题的时候 搞得很头疼,网上的回答很多单数不全面,测试总有问题 所以我打算系统的讲解一下:保证你跟着步奏走就成功,方法不是很好
但是思路基本可以,有好的意见希望指教:
1 我用到了WinInet 编程 至于他是什么东西:友情链接 /article/1412681.html
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; //你懂的
CHttpFile* pHttpFile = NULL; //用来接受视频文件
CStdioFile pLocalFile; // 用来保存到本地
DWORD dwlen;
try
{
LPBYTE lpBuf = new byte[dwBufSize];
// 把这个szPath置为D://test.jpg就行了 “1.jpg” 图片格式先得通过浏览器查看 至于名字就随便
pLocalFile.Open( "1.jpg",
CFile::modeCreate |
CFile::modeWrite |
CFile::typeBinary );
pHttpFile =(CHttpFile*)Session->OpenURL(
"http://192.168.1.1:8080/?action=snapshot",
1,
INTERNET_FLAG_TRANSFER_BINARY |
INTERNET_FLAG_RELOAD |
INTERNET_FLAG_DONT_CACHE,
NULL,
0);
while(dwlen = pHttpFile-> Read(lpBuf, dwBufSize-1 ))
{
pLocalFile.Write(lpBuf,dwlen);
}
pLocalFile.Close();
pHttpFile->Close();
pHttpFile=NULL;
delete[] lpBuf;
}
catch(CInternetException eInt)
{
eInt.Delete();
}
catch(CMemoryException eMem)
{
eMem.Delete();
}
catch(CFileException eFile)
{
eFile.Delete();
}
//到这里其实你已经实现了将远地视频变成本地的一张张图片 但是我们要播放所以要马上一张张的显示到图片控件上
//这个方法有点差,他是经过合成本地再从本地拉出来:希望哪位大神 能给个方法直接将获得的数据展示到图片控件上
//望赐教
//下面就是如何显示图片了 关键问题: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 :/article/10098598.html
但是思路基本可以,有好的意见希望指教:
1 我用到了WinInet 编程 至于他是什么东西:友情链接 /article/1412681.html
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; //你懂的
CHttpFile* pHttpFile = NULL; //用来接受视频文件
CStdioFile pLocalFile; // 用来保存到本地
DWORD dwlen;
try
{
LPBYTE lpBuf = new byte[dwBufSize];
// 把这个szPath置为D://test.jpg就行了 “1.jpg” 图片格式先得通过浏览器查看 至于名字就随便
pLocalFile.Open( "1.jpg",
CFile::modeCreate |
CFile::modeWrite |
CFile::typeBinary );
pHttpFile =(CHttpFile*)Session->OpenURL(
"http://192.168.1.1:8080/?action=snapshot",
1,
INTERNET_FLAG_TRANSFER_BINARY |
INTERNET_FLAG_RELOAD |
INTERNET_FLAG_DONT_CACHE,
NULL,
0);
while(dwlen = pHttpFile-> Read(lpBuf, dwBufSize-1 ))
{
pLocalFile.Write(lpBuf,dwlen);
}
pLocalFile.Close();
pHttpFile->Close();
pHttpFile=NULL;
delete[] lpBuf;
}
catch(CInternetException eInt)
{
eInt.Delete();
}
catch(CMemoryException eMem)
{
eMem.Delete();
}
catch(CFileException eFile)
{
eFile.Delete();
}
//到这里其实你已经实现了将远地视频变成本地的一张张图片 但是我们要播放所以要马上一张张的显示到图片控件上
//这个方法有点差,他是经过合成本地再从本地拉出来:希望哪位大神 能给个方法直接将获得的数据展示到图片控件上
//望赐教
//下面就是如何显示图片了 关键问题: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 :/article/10098598.html
相关文章推荐
- 在VS中通过MFC图片控件显示视频
- 在VS中通过MFC图片控件显示视频
- opencv 显示一个图片/播放视频
- opencv2在MFC对话框控件中显示图片播放视频
- OpenCV系列1-简单高效:MFC显示图片、播放视频
- MFC中Pictrue控件显示图片+播放视频
- C# 通过URL获取图片并显示在PictureBox上的方法
- jsp通过URL跨站请求一个图片并展示
- 通过URL调用系统的其他程序 如: 短信 电话 ipod ipod播放列表 ipod的视频。。。
- OpenCV学习笔记 利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面 .
- VC使用IPicture显示网上图片(通过URL指定)
- 知乎上有一个问题“在mfc框架中,有上面方法能直接将opencv2.0库中的Mat格式图片传递到Picture Control”中显示?
- ImageView显示视频的第一帧图片&&VideoView视频播放
- 在Android中如何获取视频的第一帧图片并显示在一个ImageView中
- Spring MVC中redirect到一个页面,同时带些信息过去进行显示,但是不通过Session方式及URL方式
- Android之通过VideoView控件播放一个视频出现的问题以及我的解决办法
- 点击图片让video视频显示并自动播放/循环播放
- OpenCV入门系列(4):显示一张图片和一个视频
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- Android ViewPager中显示图片与播放视频的填坑记录