2,543
社区成员
发帖
与我相关
我的任务
分享
void CJpegTestDlg::OnSaveVideo()
{
HRESULT hr;
char url[1000] = "http://192.168.223.128:8080/?action=snapshot";
HINTERNET internet= InternetOpen("HTTP Downloader",INTERNET_OPEN_TYPE_PRECONFIG,
NULL,NULL, NULL);
if( !internet )
{
MessageBox(" 没有视频信号");
return ;
}
HINTERNET file_handle = InternetOpenUrl(internet, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);
if( !file_handle)
return ;
HGLOBAL hImageMemory_1=GlobalAlloc(GMEM_MOVEABLE, 2097152); //给图片分配全局内存
if( hImageMemory_1==NULL)
{
AfxMessageBox(" 没有分配内存");
return ;
}
void *pImageMemory_1=GlobalLock(hImageMemory_1); //锁定内存
DWORD bytes_read;
//DWORD dwReadedSize; //保存实际读取的文件大小
BOOL b = InternetReadFile(file_handle,pImageMemory_1,2097152,&bytes_read);
GlobalUnlock(hImageMemory_1); //解锁内存
CloseHandle(file_handle); //关闭文件句柄
if(!b)
return;
CDC* pDC = GetDlgItem(IDC_ShowImg) ->GetDC();
HDC hDC = pDC ->GetSafeHdc();
CRect rect;
GetDlgItem(IDC_ShowImg) ->GetClientRect( &rect );
//HRESULT hr;
IStream *pIStream;//创建一个IStream接口指针,用来保存图片流
IPicture *pIPicture;//创建一个IPicture接口指针,表示图片对象
hr = CreateStreamOnHGlobal(hImageMemory_1, false, &pIStream); //用全局内存初使化IStream接口指针
ASSERT(SUCCEEDED(hr));
hr = OleLoadPicture(pIStream, 0, false, IID_IPicture, (LPVOID*)&(pIPicture));//用OleLoadPicture获得IPicture接口指针
ASSERT(SUCCEEDED(hr));
long hmWidth;
long hmHeight;
pIPicture->get_Width(&hmWidth); //用接口方法获得图片的宽和高
pIPicture->get_Height(&hmHeight);
pIPicture->Render(hDC,0,0,800,600,0,hmHeight,hmWidth,-hmHeight,NULL);
//*********************AVI********
AVIFileInit();
AVISTREAMINFO strhdr;
PAVIFILE m_aviFile;
PAVISTREAM m_aviVideoStream;
int m_aviVideoFrames=0;
LPTSTR aviFileFullName = _T("MyAVI.avi");
while(1)
{
//AVIFILEINFO aviFileInfo = {0};
//PAVIFILE pfile;
CoInitialize(NULL);
int ret = 0,n = 0;
CoInitialize(NULL);
ret = AVIFileOpen(&m_aviFile,aviFileFullName,OF_WRITE | OF_CREATE,NULL);
n = GetLastError();
if (ret!=AVIERR_OK)
{
if (m_aviFile!=NULL)
AVIFileRelease(m_aviFile);
//MessageBox("error");
return ;
}
AVISTREAMINFOW m_aviVideoStreamInfo;
m_aviVideoStreamInfo.fccType = streamtypeVIDEO;
m_aviVideoStreamInfo.fccHandler = 0;
m_aviVideoStreamInfo.dwFlags = 0;
m_aviVideoStreamInfo.dwCaps = 0;
m_aviVideoStreamInfo.wPriority = 0;
m_aviVideoStreamInfo.wLanguage = 0;
m_aviVideoStreamInfo.dwRate = 5; //每秒5帧
m_aviVideoStreamInfo.dwScale = 1;
m_aviVideoStreamInfo.dwQuality = 0;
m_aviVideoStreamInfo.dwSuggestedBufferSize = 1024*768*8;
m_aviVideoStreamInfo.dwStart = 0;
m_aviVideoStreamInfo.dwInitialFrames = 0;
m_aviVideoStreamInfo.dwSampleSize = 0;
m_aviVideoStreamInfo.rcFrame.left = 0;
m_aviVideoStreamInfo.rcFrame.top = 0;
m_aviVideoStreamInfo.rcFrame.right = 800;
m_aviVideoStreamInfo.rcFrame.bottom = 600;
m_aviVideoStreamInfo.dwEditCount = 0;
m_aviVideoStreamInfo.dwFormatChangeCount = 0;
strcpy((char *)m_aviVideoStreamInfo.szName,"ScreenCap.avi");
m_aviVideoStreamInfo.dwLength = 0;
AVIFileCreateStream(m_aviFile,&m_aviVideoStream,(AVISTREAMINFO *)&m_aviVideoStreamInfo);
BITMAPINFOHEADER bmpInfoHdr;
bmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER);
bmpInfoHdr.biWidth = 800;
bmpInfoHdr.biHeight = 600;
bmpInfoHdr.biBitCount = 8;
bmpInfoHdr.biCompression = BI_RGB;
bmpInfoHdr.biSizeImage = 0;
bmpInfoHdr.biClrImportant = 0;
bmpInfoHdr.biClrUsed = 0;
bmpInfoHdr.biXPelsPerMeter = 0;
bmpInfoHdr.biYPelsPerMeter = 0;
bmpInfoHdr.biPlanes = 1;
AVIStreamSetFormat(m_aviVideoStream,m_aviVideoFrames,&bmpInfoHdr,sizeof(bmpInfoHdr));
//写数据
CreateStreamOnHGlobal(NULL,TRUE,&pIStream);
LONG size;
hr=pIPicture->SaveAsFile(pIStream,TRUE,&size);
LARGE_INTEGER li;
li.HighPart =0;
li.LowPart =0;
ULARGE_INTEGER ulnewpos;
pIStream->Seek( li,STREAM_SEEK_SET,&ulnewpos);
ULONG uReadCount = 1;
pIStream->Read(buffer,sizeof(buffer),&uReadCount);
AVIStreamWrite(m_aviVideoStream,m_aviVideoFrames ,1,(LPBYTE) buffer,bmpInfoHdr.biSizeImage ,AVIIF_KEYFRAME,NULL,NULL);
m_aviVideoFrames++;
delete []buffer;
}
AVIStreamClose(m_aviVideoStream);
if(m_aviFile!=NULL)
AVIFileRelease(m_aviFile);
AVIFileExit();
//********************************************************
GlobalFree(hImageMemory_1); //释放全局内存
pIStream->Release(); //释放pIStream
pIPicture->Release(); //释放pIPicture
//::CoUninitialize();//删除此次告警就消失
::DeleteDC(hDC);
pDC->DeleteDC();
CoUninitialize();
InternetCloseHandle(internet);
}