MFC 通过一个视频URL 来播放视频 MFC IPicture 显示jpg格式图片

 当时弄这个问题的时候 搞得很头疼,网上的回答很多单数不全面,测试总有问题 所以我打算系统的讲解一下:保证你跟着步奏走就成功,方法不是很好

  但是思路基本可以,有好的意见希望指教:

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; //你懂的
     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 :http://blog.csdn.net/zhang2012liang/article/details/8716717


你可能感兴趣的:(视频,图片,url,mfc,jpg,WinINet)