AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia C++ Zugriff auf einzelne AVI Frames
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf einzelne AVI Frames

Ein Thema von LDS · begonnen am 8. Nov 2006
Antwort Antwort
LDS

Registriert seit: 14. Apr 2005
1 Beiträge
 
#1

Zugriff auf einzelne AVI Frames

  Alt 8. Nov 2006, 14:22
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]
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:19 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