Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   C++ Zugriff auf einzelne AVI Frames (https://www.delphipraxis.net/80402-zugriff-auf-einzelne-avi-frames.html)

LDS 8. Nov 2006 14:22


Zugriff auf einzelne AVI Frames
 
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]


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz