Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

runtime przy zapisie pliku .avi

Ostatnio zmodyfikowano 2011-11-05 07:15
Autor Wiadomość
xevuel
Temat założony przez niniejszego użytkownika
runtime przy zapisie pliku .avi
» 2011-10-31 11:40:05
Używając tej  bibiloteki napisałem program, który nagrywa pulpit (docelowo będzie tworzył wycinki z gier). Jednak, kiedy rozmiar pliku .avi dochodzi do ok. 1.83 GB dostaję runtima od programu. Oto mój kod:
C/C++
int wait = 1000 / 10;
HAVI avi = CreateAvi( "test.avi", wait, NULL );
HANDLE ha = CreateEvent( NULL, true, false, "et" );
HDC _dc = GetWindowDC( GetDesktopWindow() );
RECT re;
GetWindowRect( GetDesktopWindow(), & re );
int w = re.right, h = re.bottom;
tagBITMAPINFO bi;
bi.bmiHeader.biSize = sizeof( bi.bmiHeader );
bi.bmiHeader.biWidth = w;
bi.bmiHeader.biHeight = h;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = 0;
bi.bmiHeader.biSizeImage = w * h * 3;

int i = 0;
while( i < 5000 )
{
    HDC dc = CreateCompatibleDC( 0 );
    HBITMAP bm = CreateCompatibleBitmap( _dc, w, h );
    HBITMAP hbmOld =( HBITMAP ) SelectObject( dc, bm );
    StretchBlt( dc, 0, 0, w, h, _dc, 0, 0, w, h, SRCCOPY );
    void * buf = new char[ w * h * 3 ];
    //GetObject(bm,84,buf);
   
    HBITMAP hbm = CreateDIBSection( _dc, & bi, DIB_RGB_COLORS, & buf, 0, 0 );
    GetDIBits( _dc, bm, 0, h, buf, & bi, DIB_RGB_COLORS );
   
    AddAviFrame( avi, hbm );
   
    SelectObject( dc, hbmOld );
    DeleteDC( dc );
    DeleteObject( hbmOld );
    DeleteObject( hbm );
    DeleteObject( bm );
    delete[] buf;
   
    i++;
    WaitForSingleObject( ha, wait );
}

ReleaseDC( GetDesktopWindow(), _dc );
MessageBox( 0, "Koniec", 0, 0 );
CloseAvi( avi );
SendMessage( hwnd, WM_DESTROY, 0, 0 );
Kod funkcji AddAviFrame jest w linku powyżej, ale podaję:
C/C++
HRESULT AddAviFrame( HAVI avi, HBITMAP hbm )
{ if( avi == NULL ) return AVIERR_BADHANDLE;
   
    if( hbm == NULL ) return AVIERR_BADPARAM;
   
    DIBSECTION dibs; int sbm = GetObject( hbm, sizeof( dibs ), & dibs );
    if( sbm != sizeof( DIBSECTION ) ) return AVIERR_BADPARAM;
   
    TAviUtil * au =( TAviUtil * ) avi;
    if( au->iserr ) return AVIERR_ERROR;
    //
    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; }
    }
    //
    // create an empty compression, if the user hasn't set any
    if( au->psCompressed == 0 )
    { AVICOMPRESSOPTIONS opts; ZeroMemory( & opts, sizeof( opts ) );
        opts.fccHandler = mmioFOURCC( 'D', 'I', 'B', ' ' );
        HRESULT hr = AVIMakeCompressedStream( & au->psCompressed, au->ps, & opts, NULL );
        if( hr != AVIERR_OK ) { au->iserr = true; return hr; }
        hr = AVIStreamSetFormat( au->psCompressed, 0, & dibs.dsBmih, dibs.dsBmih.biSize + dibs.dsBmih.biClrUsed * sizeof( RGBQUAD ) );
        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;
}
Da się coś zrobić, aby tego runtime-a nie dostawać?

PS. Na początku wieszał się po 980 MB, ale część kodu przeniosłem poza pętlę.
PS2. 1.83 GB to około 25 sekund filmu. Wiem że to strasznie dużo, ten rozmiar, ale na razie mam inny problem...
P-43127
pekfos
» 2011-10-31 13:07:36
debuggera użyj?
P-43131
xevuel
Temat założony przez niniejszego użytkownika
» 2011-10-31 13:49:42
Używam Dev-a... Code::Blocks mam, ale z niego nie korzystam, więc jakbyś mógł napisać: gdzie mogę sprawdzić w tym debuggerze która część wymaga optymalizacji?
P-43136
akwes
» 2011-10-31 13:51:53
Dlaczego jeździsz fiatem jak masz ładną nową mazdę w garażu?
P-43137
xevuel
Temat założony przez niniejszego użytkownika
» 2011-10-31 13:53:01
Przyzwyczaiłem się do fiata, a na razie Mazda mi nie jest koniecznie potrzebna...
P-43138
akwes
» 2011-10-31 14:05:42
google: dev c++ debugger

polskie forum (aczkolwiek trochę offtopu jest) pierwszy wynik
drugi wynik

nawet film jest

Ustawiasz w odpowiednim miejscu breakpoint i patrzysz, która zmienna (o ile jest tam sensowny pogląd) jest zła że wywala program :P

Gdzie postawić i jaką zmienną patrzyć to już zależy całkowicie od Twojego kodu.

Aczkolwiek 1.83 GB to duża liczba
1.83 GB = 1 873.92 MB = 1 918 894.08 KB = 1 964 947 538 B

Wystarczająco aby przekroczyć zakres jakiejś zmiennej :P Może ustalasz gdzieś typ zmiennej liczący rozmiar?
P-43139
DejaVu
» 2011-10-31 16:59:23
Sprawdziłeś czy Twój proces nie pochłania zbyt dużej ilości ramu? Może dochodzi zużycie pamięci do 2GB i wówczas aplikacja się składa...
P-43147
xevuel
Temat założony przez niniejszego użytkownika
» 2011-11-03 15:21:36
Już wiem gdzie było źle... po usunięciu linijki
delete[] buf;
 wszystko jest ok. Dzięki :)
P-43284
« 1 » 2
  Strona 1 z 2 Następna strona