用vfw函数以压缩方式合并非压缩AVI视频,得到的视频能播放但现实为黑屏,什么原因?
shmxu 2009-09-11 10:01:16 用vfw函数以压缩方式合并非压缩AVI视频,得到的视频能播放但现实为黑屏,什么原因?
希望各位高手帮助解决一下,谢谢!
代码如下:
void UnitCOMPAVI(CString AVIPathName, CString AVIPathName1,CString AVIPathName2)
{
PAVIFILE pfile1, pfile2, pfile3;
AVIFILEINFO pfi;
PAVISTREAM pavi1, pavi2 ,pavi3,pcompressedavi;
AVISTREAMINFO strhdr;
BITMAPINFOHEADER bi;
LONG lStreamStart;
LONG lStreamSize;
LPVOID lpData1;
LPVOID lpData2;
int n=0;
long ret=0,n1=0,n2=0;
HRESULT hr;
AVICOMPRESSOPTIONS m_aviComOpt;
AVICOMPRESSOPTIONS * aopts = &m_aviComOpt;
//initializes the AVIFile library,同AVIFileExit()对应。
//Call AVIFileInit() before using any other AVIFile functions
AVIFileInit();
AVIFileOpen(&pfile1,AVIPathName1,OF_READ & OF_SHARE_DENY_NONE,NULL);
AVIFileOpen(&pfile2,AVIPathName2,OF_READ & OF_SHARE_DENY_NONE,NULL);
AVIFileGetStream(pfile1,&pavi1,streamtypeVIDEO,0);
AVIFileGetStream(pfile2,&pavi2,streamtypeVIDEO,0);
AVIFileOpen(&pfile3,AVIPathName,OF_WRITE | OF_CREATE, NULL);
PAVIFILE pf;
AVIStreamFormatSize(pavi1, 0, &lStreamSize);
lStreamSize = sizeof(bi);
AVIStreamReadFormat(pavi1, 0, &bi, &lStreamSize); // Read format
AVIStreamInfo(pavi1, &strhdr, sizeof(strhdr));
memset(strhdr.szName,0,sizeof(char)*64);
AVIFileCreateStream(pfile3, &pavi3, &strhdr);
// Set format of new stream using AVIStreamSetFormat.
AVIStreamSetFormat(pavi3, 0, &bi, sizeof(bi));
memset(&m_aviComOpt, 0, sizeof(m_aviComOpt));
// if (!AVISaveOptions(NULL, 0, 1, &pavi3, &aopts) )
// ;
memset(&m_aviComOpt, 0, sizeof(m_aviComOpt));
m_aviComOpt.fccType = streamtypeVIDEO;
m_aviComOpt.fccHandler = mmioFOURCC('M', 'S', 'V', 'C');
m_aviComOpt.dwKeyFrameEvery = 15; // keyframe rate
m_aviComOpt.dwQuality = 5000; // compress quality 0-10,000
m_aviComOpt.dwBytesPerSecond = 0; // bytes per second
m_aviComOpt.dwFlags = AVICOMPRESSF_VALID | AVICOMPRESSF_KEYFRAMES; // flags
m_aviComOpt.lpFormat = 0x0; // save format
m_aviComOpt.cbFormat = 0;
m_aviComOpt.dwInterleaveEvery = 0; // for non-video streams only
// memset(&m_aviComOpt,0,sizeof(AVICOMPRESSOPTIONS));
// m_aviComOpt.fccType = streamtypeVIDEO;//视频
// m_aviComOpt.fccHandler = mmioFOURCC('I','V','3','2');//压缩驱动扩展名
// m_aviComOpt.dwKeyFrameEvery = 15;//关键帧
// m_aviComOpt.dwQuality = 5000;//压缩质量
// m_aviComOpt.dwFlags = AVICOMPRESSF_KEYFRAMES;//关键帧方式
hr = AVIMakeCompressedStream(&pcompressedavi, pavi3, &m_aviComOpt, NULL);
if (hr != AVIERR_OK) {
return;
}
hr = AVIStreamSetFormat(pcompressedavi, 0,
&bi, // stream format
sizeof(bi));
if (hr != AVIERR_OK) {
return;
}
// Allocate memory for the bitmaps.
lStreamStart = AVIStreamStart(pavi1);
lStreamSize = AVIStreamLength(pavi1);
lpData1 = new unsigned char [bi.biSizeImage];
for(n=0;n<lStreamSize;n++)
{
memset(lpData1,0,bi.biSizeImage);
ret=AVIStreamRead(pavi1, lStreamStart+n , 1 , lpData1,bi.biSizeImage ,
&n1, &n2);
ret=AVIStreamWrite(pcompressedavi, lStreamStart+n , 1 , lpData1,
bi.biSizeImage, AVIIF_KEYFRAME, &n1, &n2);
}
AVIStreamReadFormat(pavi2, 0, &bi, &lStreamSize); // Read format
int pos = AVIStreamEnd(pavi1);
lStreamStart = AVIStreamStart(pavi2);
lStreamSize = AVIStreamLength(pavi2);
// lpData2 = new unsigned char[bi.biSizeImage];
for(n=0;n<lStreamSize;n++)
{
memset(lpData1,0,bi.biSizeImage);
AVIStreamRead(pavi2, lStreamStart+n , 1 , lpData1,bi.biSizeImage ,
&n1, &n2);
AVIStreamWrite(pcompressedavi, pos+n, 1 , lpData1,
bi.biSizeImage, AVIIF_KEYFRAME, &n1, &n2);
}
delete[] lpData1;
AVIStreamRelease(pavi1);
AVIStreamRelease(pavi2);
AVIStreamRelease(pavi3);
AVIStreamRelease(pcompressedavi);
AVIFileRelease(pfile1);
AVIFileRelease(pfile2);
AVIFileRelease(pfile3);
AVIFileExit();
}