视频数据怎么保存到AVI文件
视频数据如何保存到AVI文件
本人新手一个,遇到了一个问题,想请教各位大虾。
我想把服务器发来的视频数据保存成一个AVI文件,我用VFW的函数操作的,可是在播放的时候,却什么也没有,只能看到时间。为什么会这样呢?想了好几天了,没结果,急等。
下面是一些代码:
void SaveSubVideo(pFrameHeadr pFrmHdr, unsigned int dwContext)
{
nRet=0;
strTemp= new char[32];
tmp=new BYTE[pFrmHdr->dataSize];
memcpy(tmp,pFrmHdr->pData,pFrmHdr->dataSize);
memset(&strhdr,0,sizeof(strhdr));
if(nFrames==0)
{
AVIFileInit();
nRet=AVIFileOpen(&pFile,g_csFileName,OF_WRITE |OF_CREATE,NULL);
if(nRet!=0)
{
memset(strTemp,0,32);
sprintf(strTemp,"%d",nRet);
AfxMessageBox(strTemp);
}
memset(&bmpInfoHdr,0,sizeof(bmpInfoHdr));
bmpInfoHdr.biSize=sizeof(BITMAPINFOHEADER);
bmpInfoHdr.biWidth=pFrmHdr->videoParam.videoWidth;
bmpInfoHdr.biHeight=pFrmHdr->videoParam.videoHeight;
bmpInfoHdr.biPlanes=1;
bmpInfoHdr.biBitCount=24;//12;
bmpInfoHdr.biCompression=BI_RGB;//mmioFOURCC('Y','V','1','2');
bmpInfoHdr.biSizeImage=pFrmHdr->dataSize;
strhdr.fccType=streamtypeVIDEO;
strhdr.fccHandler=mmioFOURCC('Y','V','1','2');//mmioFOURCC('x','v','i','d');//
strhdr.dwScale=1;
strhdr.dwRate=10;//pFrmHdr->frameRate;
strhdr.dwQuality=-1;
strhdr.dwSuggestedBufferSize=pFrmHdr->dataSize;
strhdr.dwSampleSize=0;//pFrmHdr->dataSize;
//strhdr.dwFlags=AVISTREAMINFO_DISABLED;
SetRect(&strhdr.rcFrame,0,0,pFrmHdr->videoParam.videoWidth,pFrmHdr->videoParam.videoHeight);
nRet=AVIFileCreateStream(pFile,&ps,&strhdr);
if(nRet!=0)
{
memset(strTemp,0,32);
sprintf(strTemp,"%x",nRet);
strcat(strTemp,"Create Stream Failed");
AfxMessageBox(strTemp);
}
}
if(AVIStreamSetFormat(ps,nFrames,&bmpInfoHdr,sizeof(bmpInfoHdr))!=AVIERR_OK)
{
memset(strTemp,0,32);
sprintf(strTemp,"%x",nRet);
strcat(strTemp," Set Formate Failed");
AfxMessageBox(strTemp);
}
nRet=AVIStreamWrite(ps,nFrames,1,tmp,pFrmHdr->dataSize,AVIIF_KEYFRAME,NULL,NULL);
if(nRet!=0)
{
memset(strTemp,0,32);
sprintf(strTemp,"%x",nRet);
strcat(strTemp,"Stream Write Failed");
AfxMessageBox(strTemp);
}
nFrames++;
delete[] strTemp;
delete[] tmp;
tmp=NULL;
strTemp=NULL;
}
另有一个函数是做结尾工作的
void CJiankongDlg::OnBnClickedButton4()
{
AVIStreamRelease(ps);
AVIFileRelease(pFile);
AVIFileExit();
ps=NULL;
pFile=NULL;
}
其中pFrameHeadr就是发来的视频数据类型,是不是我中间的某些参数没设置正确啊,还是有其它的操作没做?
敬请大家帮帮忙,在此先谢过了。
------解决方案--------------------
建议试试opencv做视频方面的操作~~
保存这是一个函数的问题~~
------解决方案--------------------
使用OPENCV so easy
本人新手一个,遇到了一个问题,想请教各位大虾。
我想把服务器发来的视频数据保存成一个AVI文件,我用VFW的函数操作的,可是在播放的时候,却什么也没有,只能看到时间。为什么会这样呢?想了好几天了,没结果,急等。
下面是一些代码:
void SaveSubVideo(pFrameHeadr pFrmHdr, unsigned int dwContext)
{
nRet=0;
strTemp= new char[32];
tmp=new BYTE[pFrmHdr->dataSize];
memcpy(tmp,pFrmHdr->pData,pFrmHdr->dataSize);
memset(&strhdr,0,sizeof(strhdr));
if(nFrames==0)
{
AVIFileInit();
nRet=AVIFileOpen(&pFile,g_csFileName,OF_WRITE |OF_CREATE,NULL);
if(nRet!=0)
{
memset(strTemp,0,32);
sprintf(strTemp,"%d",nRet);
AfxMessageBox(strTemp);
}
memset(&bmpInfoHdr,0,sizeof(bmpInfoHdr));
bmpInfoHdr.biSize=sizeof(BITMAPINFOHEADER);
bmpInfoHdr.biWidth=pFrmHdr->videoParam.videoWidth;
bmpInfoHdr.biHeight=pFrmHdr->videoParam.videoHeight;
bmpInfoHdr.biPlanes=1;
bmpInfoHdr.biBitCount=24;//12;
bmpInfoHdr.biCompression=BI_RGB;//mmioFOURCC('Y','V','1','2');
bmpInfoHdr.biSizeImage=pFrmHdr->dataSize;
strhdr.fccType=streamtypeVIDEO;
strhdr.fccHandler=mmioFOURCC('Y','V','1','2');//mmioFOURCC('x','v','i','d');//
strhdr.dwScale=1;
strhdr.dwRate=10;//pFrmHdr->frameRate;
strhdr.dwQuality=-1;
strhdr.dwSuggestedBufferSize=pFrmHdr->dataSize;
strhdr.dwSampleSize=0;//pFrmHdr->dataSize;
//strhdr.dwFlags=AVISTREAMINFO_DISABLED;
SetRect(&strhdr.rcFrame,0,0,pFrmHdr->videoParam.videoWidth,pFrmHdr->videoParam.videoHeight);
nRet=AVIFileCreateStream(pFile,&ps,&strhdr);
if(nRet!=0)
{
memset(strTemp,0,32);
sprintf(strTemp,"%x",nRet);
strcat(strTemp,"Create Stream Failed");
AfxMessageBox(strTemp);
}
}
if(AVIStreamSetFormat(ps,nFrames,&bmpInfoHdr,sizeof(bmpInfoHdr))!=AVIERR_OK)
{
memset(strTemp,0,32);
sprintf(strTemp,"%x",nRet);
strcat(strTemp," Set Formate Failed");
AfxMessageBox(strTemp);
}
nRet=AVIStreamWrite(ps,nFrames,1,tmp,pFrmHdr->dataSize,AVIIF_KEYFRAME,NULL,NULL);
if(nRet!=0)
{
memset(strTemp,0,32);
sprintf(strTemp,"%x",nRet);
strcat(strTemp,"Stream Write Failed");
AfxMessageBox(strTemp);
}
nFrames++;
delete[] strTemp;
delete[] tmp;
tmp=NULL;
strTemp=NULL;
}
另有一个函数是做结尾工作的
void CJiankongDlg::OnBnClickedButton4()
{
AVIStreamRelease(ps);
AVIFileRelease(pFile);
AVIFileExit();
ps=NULL;
pFile=NULL;
}
其中pFrameHeadr就是发来的视频数据类型,是不是我中间的某些参数没设置正确啊,还是有其它的操作没做?
敬请大家帮帮忙,在此先谢过了。
------解决方案--------------------
建议试试opencv做视频方面的操作~~
保存这是一个函数的问题~~
------解决方案--------------------
使用OPENCV so easy