您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: