用VFW存储成AVI文件,但生成的AVI文件不能用Microsoft MEPG4 V2压缩,而是必须先经M-JPEG压缩后,才能压成MPEG4,有没生成的AVI可直接用MPEG4压的方法?
我是用DIRECTX9中的示例:CompressView来压缩的。
下面是初始化的代码,是不是改什么参数有就办法做到?
         int i,s,width,height;
i = 0;
s = sizeof(BITMAPINFOHEADER);

avifile.pstm  = NULL;
avifile.pcstm = NULL;
avifile.pavi  = NULL;
avifile.pbmih = NULL;
avifile.error = NOERROR;
avifile.index = 0;
avifile.bIsCCIRVGA = FALSE;
avifile.hCCIRDib=0; avifile.ulSampWritten = 0;
avifile.ulBytesWritten = 0;  width  = pAB->Avi.width;
height = pAB->Avi.height; //video empty
width  = pAB->Avi.width;
height = pAB->Avi.height; //for CCIR
    if(pAB->Video.senid == CCIR656)
{
   if(width >= 640)
   {
width  = 640;
height = 480; avifile.bIsCCIRVGA = TRUE;
avifile.hCCIRDib = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE,width*height*3);
   }
    }
if(width == 160)
    {
width  = 160;
height = 120; avifile.hCCIRDib = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE,width*height*3);
    } //
// AVIStream Information
//
avifile.si.fccType = streamtypeVIDEO;
//avifile.si.fccHandler = ('D','I','B',' '),
//avifile.si.fccHandler = mmioFOURCC('I','Y','U','V');
//avifile.si.fccHandler = mmioFOURCC('I', 'V', '5', '0');
avifile.si.fccHandler = fourcc; avifile.si.dwFlags = 0;
avifile.si.dwCaps = 0;
avifile.si.wPriority = 0;
avifile.si.wLanguage = 0;
avifile.si.dwScale = 1;
avifile.si.dwRate = pAB->Avi.f_s;
avifile.si.dwLength = 0;
avifile.si.dwInitialFrames = 0;
avifile.si.dwSuggestedBufferSize = 0;
avifile.si.dwQuality  = (DWORD)100;
avifile.si.dwSampleSize  = 0;
avifile.si.rcFrame.left = 0;
avifile.si.rcFrame.top = 0;
avifile.si.rcFrame.right = width;
avifile.si.rcFrame.bottom = height;
avifile.si.dwEditCount = 0;
avifile.si.dwFormatChangeCount = 0; strcpy(avifile.si.szName,"Video Stream"); //
// AVICompressionStream Information
//
avifile.ci.fccType = streamtypeVIDEO;
avifile.ci.fccHandler = avifile.si.fccHandler;
avifile.ci.dwKeyFrameEvery = 15;
avifile.ci.dwQuality = avifile.si.dwQuality;
avifile.ci.dwBytesPerSecond = 1000/8;
avifile.ci.dwFlags = AVICOMPRESSF_KEYFRAMES | AVICOMPRESSF_VALID | AVICOMPRESSF_DATARATE | AVICOMPRESSF_INTERLEAVE;
avifile.ci.lpFormat = 0;
avifile.ci.cbFormat = 0;
avifile.ci.lpParms = 0;
avifile.ci.cbParms = 0;
avifile.ci.dwInterleaveEvery = 0; avifile.rawsize = width*height*3;//width*height*3;

avifile.pbmih =( LPBITMAPINFOHEADER)realloc(avifile.pbmih,sizeof(BITMAPINFOHEADER)+avifile.rawsize); //fly:050131 , error check
if(!avifile.pbmih)
{
        return E_FAIL;
} avifile.pbmih->biSize = sizeof(BITMAPINFOHEADER);
avifile.pbmih->biWidth = width; 
avifile.pbmih->biHeight = height; 
avifile.pbmih->biPlanes = 1;  
avifile.pbmih->biBitCount = 24; 
avifile.pbmih->biCompression = BI_RGB; 
avifile.pbmih->biSizeImage = avifile.rawsize; 
avifile.pbmih->biXPelsPerMeter = 0; 
avifile.pbmih->biYPelsPerMeter = 0; 
avifile.pbmih->biClrUsed = 0; 
avifile.pbmih->biClrImportant = 0;  AVIFileExit();
AVIFileInit();  HRESULT hrOpen=AVIFileOpen(&avifile.pavi,(char *)pAB->Avi.f_name, OF_CREATE | OF_WRITE | OF_SHARE_DENY_NONE,NULL);
if (hrOpen!=0)
{
return E_FAIL;
} if (AVIFileCreateStream(avifile.pavi,&avifile.pstm,&avifile.si)!=0)
{
return E_FAIL;
} if(FAILED(AVIMakeCompressedStream(&avifile.pcstm,avifile.pstm,&avifile.ci,NULL)))
{
return E_FAIL;
} /*
*  Audio Stream
*/
if(pAB->socket_data.urlmsg.audio==1)
{
ZeroMemory(&avifile.au.si,sizeof(avifile.au.si)); avifile.au.si.fccType = streamtypeAUDIO;
avifile.au.si.fccHandler = 0; // Zero for PCM audio.
avifile.au.si.dwFlags = 0;
avifile.au.si.dwCaps = 0;
avifile.au.si.wPriority = 0;
avifile.au.si.wLanguage = 0;
avifile.au.si.dwScale = pAB->Audio.wftx.wft.nBlockAlign;
avifile.au.si.dwRate = 5588;
avifile.au.si.dwLength = 0;
avifile.au.si.dwInitialFrames = 0;
avifile.au.si.dwSuggestedBufferSize = 0;
avifile.au.si.dwQuality  = (DWORD)-1;
avifile.au.si.dwSampleSize  = pAB->Audio.wftx.wft.nBlockAlign;
avifile.au.si.rcFrame.left = 0;
avifile.au.si.rcFrame.top = 0;
avifile.au.si.rcFrame.right = 0;
avifile.au.si.rcFrame.bottom = 0;
avifile.au.si.dwEditCount = 0;
avifile.au.si.dwFormatChangeCount = 0;

strcpy(avifile.au.si.szName, "Audio"); if(AVIFileCreateStream(avifile.pavi,&avifile.au.pstm,&avifile.au.si)!=0)
{
return E_FAIL;
}
       
if (AVIStreamSetFormat(avifile.au.pstm,0,&pAb->Audio.wftx.wft,sizeof(pAB->Audio.wftx))!=0)
{
return E_FAIL;
} avifile.au.nsamp = 0; }