Znów mały kłopot .... chyba jednak będę troszke musiał podszkolić to C jeśli chce to napisać. Napisałem tak program (specjalnie pominąłem sprawdzenie kodów błędu w początkowych funkcjach bo wiem na pewno że działają OK a nie chce gmatwać kodu) i niestety cały czas dostaję błąd z funkcji zapisu strumienia "AVIStreamWrite(...)". Możecie coś podpowiedzieć ? Może źle ustawiam strukturę "AVICOMPRESSOPTIONS" albo coś nie tak z "AVIStreamSetFormat" ? Poniżej wklejam kod:
#include <stdio.h>
#include "headers\vfw.h"
int main(int argc, char *argv[]){
printf("Encoder MPEG4 plikow .avi\n");
int retCode;
AVIFileInit();
PAVIFILE *aviSourceFile = new PAVIFILE();
retCode = AVIFileOpen(aviSourceFile, "c:\\POLIBUDA\\movie.avi", OF_READ, NULL);
AVIFILEINFO aviFileInfo;
AVIFileInfo(*aviSourceFile, &aviFileInfo, sizeof(AVIFILEINFO));
PAVISTREAM *aviSourceStream = new PAVISTREAM();
AVIFileGetStream(*aviSourceFile, aviSourceStream, streamtypeVIDEO , 0);
AVISTREAMINFO aviStreamInfo;
ZeroMemory(&aviStreamInfo,sizeof(aviStreamInfo));
AVIStreamInfo(*aviSourceStream, &aviStreamInfo, sizeof(AVISTREAMINFO));
PAVIFILE *aviDesFile = new PAVIFILE();
AVIFileOpen(aviDesFile, "c:\\POLIBUDA\\movie2.avi", OF_CREATE | OF_WRITE, NULL);
//tworzenie skompresowanego strumienia do zapisu;
PAVISTREAM *aviDesStream= new PAVISTREAM();
AVICOMPRESSOPTIONS aviCompressOptions;
ZeroMemory(&aviCompressOptions,sizeof(AVICOMPRESSOPTIONS));
aviCompressOptions.fccType = streamtypeVIDEO;
//aviCompressOptions.fccHandler=mmioFOURCC('d','i','v','x');
aviCompressOptions.fccHandler = aviStreamInfo.fccHandler; // narazie taki który wiem napewno że zadziała
aviCompressOptions.dwQuality = aviStreamInfo.dwQuality;
aviCompressOptions.dwFlags = AVICOMPRESSF_VALID;
if(AVIMakeCompressedStream(aviDesStream, *aviSourceStream, &aviCompressOptions, NULL) == AVIERR_OK)
printf("utworzono strumien do zapisu\n");
long lSize = 0;
AVIStreamReadFormat(*aviSourceStream, 0, NULL, &lSize);
char format[(int)lSize];
AVIStreamReadFormat(*aviSourceStream, 0,format, &lSize);
AVIStreamSetFormat(*aviDesStream, 0,format, lSize);
AVIMakeFileFromStreams(aviDesFile, 1, aviDesStream);
int i = 0;
char buffer[720*576*3]; // bo filmik jest w rozdzielczości 720x576
while((retCode = AVIStreamRead(*aviSourceStream, i, 1, &buffer, sizeof(buffer), NULL, NULL)) == 0){
printf("odczyt ze strumienia\n");
if((retCode = AVIStreamWrite(*aviDesStream, i, 1, &buffer, sizeof(buffer), AVIIF_KEYFRAME, NULL, NULL))==0)
printf("zapis do strumienia\n");
else{
printf("blad zapisu do strumienia\n");
}
i++;
}
AVIStreamRelease(*aviDesStream);
AVIFileRelease(*aviDesFile);
AVIStreamRelease(*aviSourceStream);
AVIFileRelease(*aviSourceFile);
AVIFileExit();
return 0;
}