Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Hasło nie zostało zweryfikowane
Niniejsze hasło zostało opracowane, jednak nie zostało ono zweryfikowane przez administrację serwisu. Jeżeli znalazłeś błędy merytoryczne w niniejszym dokumencie, prosimy o ich zgłoszenie na forum w dziale Znalezione błędy.
Opracował: xevuel
Biblioteki C/C++

AVIStreamWrite

[funkcja] Zapisuje dane do podanego strumienia.

Składnia

C/C++
#include <vfw.h>

STDAPI AVIStreamWrite(
PAVISTREAM pavi,
LONG lStart,
LONG lSamples,
LPVOID lpBuffer,
LONG cbBuffer,
DWORD dwFlags,
LONG * plSampWritten,
LONG * plBytesWritten
);

Argumenty

ArgumentOpis
paviUchwyt do otwartego strumienia
lStartPozycja, na której zostaną zapisane dane
lSamplesLiczba klatek do zapisania
lpBufferWskaźnik na bufor zawierający dane do zapisu
cbBufferRozmiar struktury podanej w argumencie lpFormat
dwFlagsFlagi związane z danymi. Możesz użyć następującej wartości:

  • AVIIF_KEYFRAME
    Dane nie zależą od poprzednich danych w pliku.

plSampWrittenWskaźnik na liczbę zapisanych klatek. Może być NULL
plBytesWrittenWskaźnik na liczbę zapisanych bajtów. Może być NULL

Zwracana wartość

Funkcja zwraca 0, jeśli jej działanie skończyło się pomyślnie, lub kod błędu w przeciwnym wypadku

Opis szczegółowy

Funkcja AVIStreamWrite zapisuje dane do podanego strumienia.
C/C++
IAVIFile * pfile;
IAVIStream * ps;
HBITMAP hbm;

//...
// tutaj ładowanie bitmapy do pamięci. Uwaga! Jeśli otwieramy bitmapę z pliku, musimy użyć flagi LR_CREATEDIBSECTION!
//...

DIBSECTION dibs;
int sbm = GetObject( hbm, sizeof( dibs ), & dibs );
if( sbm != sizeof( DIBSECTION ) )
{
    //Wystąpił błąd
}

AVIFileInit();
HRESULT hr = AVIFileOpen( & pfile, "plik.avi", OF_WRITE | OF_CREATE, NULL );

AVISTREAMINFO strhdr;
ZeroMemory( & strhdr, sizeof( strhdr ) );
strhdr.fccType = streamtypeVIDEO; // typ strumienia
strhdr.fccHandler = 0;
strhdr.dwScale = 1000; //Dzielenie dwRate przez dwScale daje ilość klatek na sekundę
strhdr.dwRate = 1000;
strhdr.dwSuggestedBufferSize = dibs.dsBmih.biSizeImage;
SetRect( & strhdr.rcFrame, 0, 0, dibs.dsBmih.biWidth, dibs.dsBmih.biHeight );
hr = AVIFileCreateStream( pfile, & ps, & strhdr );
if( hr != AVIERR_OK )
{
    //Wystąpił błąd
}

AVICOMPRESSOPTIONS acopts;
IAVIStream * psCompressed;
ZeroMemory( & acopts, sizeof( acopts ) );
acopts.fccHandler = mmioFOURCC( 'D', 'I', 'B', ' ' ); //Po to była potrzebna flaga LR_CREATEDIBSECTION
hr = AVIMakeCompressedStream( & psCompressed, ps, & acopts, NULL );
if( hr != AVIERR_OK )
{
    //Wystąpił błąd
}

hr = AVIStreamSetFormat( psCompressed, 0, & dibs.dsBmih, dibs.dsBmih.biSize + dibs.dsBmih.biClrUsed * sizeof( RGBQUAD ) );
if( hr != AVIERR_OK )
{
    //Wystąpił błąd
}

int numer_klatki = 0;

hr = AVIStreamWrite( psCompressed, numer_klatki, 1, dibs.dsBm.bmBits, dibs.dsBmih.biSizeImage, AVIIF_KEYFRAME, NULL, NULL );
if( hr != AVIERR_OK )
{
    //Wystąpił błąd
}

numer_klatki++;

//Zwalniamy pamięć

AVIStreamRelease( psCompressed );
AVIStreamRelease( ps );
AVIFileRelease( pfile );
AVIFileExit();

Jeśli nie będzie żadnych błędów, po wykonaniu tego kodu plik plik.avi będzie zawierał 1-sekundowy film przedstawiający załadowaną bitmapę.

Wymagania

Minimalny obsługiwany klientWindows 2000 Professional
Minimalny obsługiwany serwerWindows 2000 Server
NagłówekVfh.h
BibliotekaVfw32.lib
DLLAvifil32.dll

Linki zewnętrzne