用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();

}
...全文
214 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
sss1983 2009-09-11
  • 打赏
  • 举报
回复
帮顶下

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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