如何将多图像流添加到AVI文件中

时间:2013-04-22 06:16:58

标签: c++ c video video-streaming avi

我正在使用C / C ++项目从图像帧中制作AVI文件作为以下输入:

  1. 流1:
    • 每秒帧数:12 fps
    • 帧数:500
  2. 流2:
    • 每秒帧数:10 fps
    • 帧数:600
  3. STREAM3:
    • 每秒帧数:15 fps
    • 帧数:700
  4. 使用avi_utils库,我尝试使用AddAviFrame()函数将这些帧添加到AVI文件中。通过这种方式,我只能创建帧速率对应的帧流。 是否可以将具有不同帧速率的多个流添加到AVI文件中?如果是,那我该怎么办。 我还试图调用发布函数AVIStreamRelease(),然后打开另一个流AVIFileCreateStream(),但它不起作用。请告诉我如何解决此案。

    HAVI CreateAvi(const char *AVIFileName, int frameperiod, const WAVEFORMATEX *wfx)
    { 
      IAVIFile *pfile;
      AVIFileInit();
      HRESULT hr = AVIFileOpen(&pfile, AVIFileName, OF_WRITE|OF_CREATE, NULL);
      if (hr!=AVIERR_OK) {AVIFileExit(); return NULL;}
      TAviUtil *au = new TAviUtil;
      au->pfile = pfile;
      if (wfx==NULL) ZeroMemory(&au->wfx,sizeof(WAVEFORMATEX)); else  CopyMemory(&au->wfx,wfx,sizeof(WAVEFORMATEX));
      au->period = frameperiod;
      au->as=0; au->ps=0; au->psCompressed=0;
      au->nframe=0; au->nsamp=0;
      au->iserr=false;
      return (HAVI)au;
    }
    HRESULT AddAviFrame(HAVI avi, HBITMAP hbm)
    { 
      if (au->ps==0) // create the stream, if it wasn't there before
      { AVISTREAMINFO strhdr; ZeroMemory(&strhdr,sizeof(strhdr));
        strhdr.fccType = streamtypeVIDEO;// stream type
        strhdr.fccHandler = 0; 
        strhdr.dwScale = au->period;
        strhdr.dwRate = 1000;
        strhdr.dwSuggestedBufferSize  = dibs.dsBmih.biSizeImage;
        SetRect(&strhdr.rcFrame, 0, 0, dibs.dsBmih.biWidth, dibs.dsBmih.biHeight);
        HRESULT hr=AVIFileCreateStream(au->pfile, &au->ps, &strhdr);
        if (hr!=AVIERR_OK) {au->iserr=true; return hr;}
      }
      //Now we can add the frame
      HRESULT hr = AVIStreamWrite(au->psCompressed, au->nframe, 1, dibs.dsBm.bmBits, dibs.dsBmih.biSizeImage, AVIIF_KEYFRAME, NULL, NULL);
      if (hr!=AVIERR_OK) {au->iserr=true; return hr;}
      au->nframe++; return S_OK;
    } 
    

    谢谢大家。

0 个答案:

没有答案