Как добавить потоки с несколькими изображениями в файл AVI

Я делаю AVI-файл из кадров изображений, используя проект C / C ++ в качестве следующего ввода:

  1. Stream1:
    • кадр в секунду: 12 кадров в секунду
    • количество кадров: 500
  2. stream2:
    • кадр в секунду: 10 кадров в секунду
    • количество кадров: 600
  3. stream3:
    • кадр в секунду: 15 кадров в секунду
    • количество кадров: 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;
}

Спасибо всем.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector