如何将IStream 保存为AVI视频

听海拉拉 2010-10-05 09:26:40
Hi all,
如题
本人写的代码如下,但只能显示图像,不能保存avi,没有头绪怎么保存avi:
 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);
}


...全文
69 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
听海拉拉 2010-10-07
  • 打赏
  • 举报
回复
哪位路过,帮忙看一下

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧