如何将IStream 保存为AVI视频

听海拉拉 听海拉拉 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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);
}


...全文

相关推荐

RTSP视频流保存成AVI文件的动态库

而AVI(Audio Video Interleave)是微软开发的一种多媒体容器格式,可存储音频和视频数据,支持多种编码方式。本知识点主要探讨如何使用特定的动态库将RTSP视频流保存为AVI文件。

humadivinity

BREW平台视频播放器设计与实现项目

BREW平台采用分层式架构设计,核心由AEE(Application Execution Environment)驱动,提供模块化运行时环境。AEE通过IModule管理应用生命周期,IApplet定义应用入口,IShell提供系统服务访问接口,三者协同实现资源调度与事件分发。// 典型AEE入口函数结构开发者需安装BREW SDK并配置Visual Studio插件或使用BREW DevTool,结合ISimulator进行调试。

滚菩提哦呢

DirectShow摄像头视频采集、保存AVI文件

**文件写入滤镜**:如AVI Splitter,负责将编码后的数据写入AVI文件。AVI格式允许同时存储视频和音频数据,是保存多媒体数据的常用容器格式。实现这个流程,开发者需要创建和连接这些滤镜。

kvliang

vc中基于mfc采集视频并且保存成avi格式

接下来,将视频数据保存为AVI格式,我们需要使用AVIFile API。AVIFile是Windows SDK的一部分,它提供了一组接口来读取和写入AVI文件。

lilinandlilin

基于ffmpeg将avi视频转换为mp4视频

**解码视频帧**:使用`avcodec_find_decoder()`找到对应的AVI视频流的解码器,然后创建解码上下文。

黄忻
评论 1
收藏 已收藏
分享
返回顶部