2

次の入力として C/C++ プロジェクトを使用して、画像フレームから AVI ファイルを作成しています。

  1. ストリーム1:
    • フレーム/秒: 12 fps
    • フレーム数:500
  2. ストリーム 2:
    • フレーム/秒: 10 fps
    • フレーム数:600
  3. ストリーム 3:
    • フレーム/秒: 15 fps
    • フレーム数:700

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;
} 

皆さんありがとう。

4

0 に答える 0