Hallo,
ich möchte den Videostream einer AVI Datei lesen, zu einem bel. Frame springen, dieses dekompromieren (vielleicht mit ICDecompressImage) und in einem Feld ablegen, in dem ich dann auf die
RGB Werte an der Position (x,y) zugreifen kann. Ich möchte es nicht auf dem Bildschirm darstellen mit DrawDibDraw.
Hier nun der lauffähige Code, der Bilder einer AVI Datei auf dem Bildschirm darstellt:
(Ich entschuldige mich für den C++ Code in einem Delphi Forum. Die Sprache sollte jedoch bei diesem Problem untergeordnet sein.)
Code:
void DisplayAVIFrame(CString strName,CDC* pDC,double t,DWORD& nWidth,DWORD& nHeight)
{
AVIFileInit();
PAVIFILE pfile;
if (AVIFileOpen(&pfile,strName,0,NULL) == 0)
{
AVIFILEINFO avifi;
avifi.dwStreams = 0;
AVIFileInfo(pfile,&avifi,sizeof(avifi));
PAVISTREAM pavi;
for (DWORD s = 0;s < avifi.dwStreams;s++)
if (AVIFileGetStream(pfile,&pavi,0L,s) == 0)
{
double StartTime = AVIStreamStartTime(pavi);
double EndTime = AVIStreamEndTime(pavi);
double Time = StartTime + t * (EndTime - StartTime);
AVISTREAMINFO avis;
AVIStreamInfo(pavi,&avis,sizeof(avis));
nWidth = avis.rcFrame.right - avis.rcFrame.left;
nHeight = avis.rcFrame.bottom - avis.rcFrame.top;
if (avis.fccType == streamtypeVIDEO)
{
PGETFRAME pgf = AVIStreamGetFrameOpen(pavi,NULL);
if (pgf)
{
LONG lCurSamp = AVIStreamTimeToSample(pavi,(LONG)Time);
BITMAPINFO* lpbi = (BITMAPINFO*)AVIStreamGetFrame(pgf,lCurSamp);
void* clr = (void*)((LPSTR)lpbi + (WORD)(lpbi->bmiHeader.biSize));
if (lpbi)
{
HDRAWDIB hdd = DrawDibOpen();
if (hdd)
{
//Hier möchte ich nun auf das einzelne Frame zugreifen!
//die folgende Zeile soll also ersetzt werden durch eine Dekomprimierung
DrawDibDraw(hdd,pDC->m_hDC,0,0,nWidth,nHeight,&lpbi->bmiHeader,NULL,0,0,1,1,0);
DrawDibClose(hdd);
}
}
AVIStreamGetFrameClose(pgf);
}
}
AVIStreamRelease(pavi);
}
AVIFileRelease(pfile);
}
AVIFileExit();
}
Ich freue mich über Hilfe,
Lennart.
[edit=Luckie]C-Codetags eingefügt. Beim nächsten Mal bitte selber machen. Mfg, Luckie[/edit]