TMediaPlayer



  • hallo leute,

    ich hab hier ein problem mit dem tmediaplayer, undzwar will ich, dass ein formular für die zeit, bis ein video läuft, verschwindet und dann wieder auftaucht, wenn das video zu ende gespielt wird.

    ich hatte das mit Sleep gemacht, aber da wartet das etwas länger als geplant...

    lblInfo->Caption="Sauber, Du bist bei Warschau angekommen, genieße den Clip!";
                    frmKarte->Enabled=false;
                    warschau=true;
                    pause=true;
                    tmr2->Enabled=false;
                    tmrZeit->Enabled=false;
                    mmBG->Stop();
                    mmVideo->FileName="warschau.wmv";
                    mmVideo->Open();
                    mmVideo->Play();
                    int i=0;
                    while(i<mmVideo->Length){ 
                      Sleep(1);
                      i++;
                    }
                    //SetCursorPos(x,y);
                    mmVideo->Stop();
                    mmVideo->Close();
                    frmKarte->Enabled=true;
                    lblInfo->Caption="Gehe über Warschau (blauer Punkt) Dein Spiel fortzusetzen! Die Zeit fängt an, wenn du den blauen Punkt berührst!";
    

    in der while schleife wartet er dann zu lange. ich habe mal die mmVideo->Length auslesen lassen, das sind mehr ms als das originalvideo eigentlich ist, deswegen steht das video, auch wenn es beendet ist, da und wird erst paar sekunden später geschlossen.

    außerdem tritt die zeile gar nicht in kraft:

    lblInfo->Caption="Sauber, Du bist bei Warschau angekommen, genieße den Clip!";
    

    anscheinend geht der direkt in den sleep bevor das ausgegeben wird...

    gibt es eine funktion/methode vom mediaplayer, wo er mir ausgibt, dass das video grad läuft?
    dann könnte ich ja so machen
    while(mmVideo->Playd);
    dann wäre das mit der zeit auch kein problem und ich brauch auch kein Sleep() zu benutzen. unter der hilfe hab ich leider nichts gefunden.

    ich benutze Borland c++ Builder 6



  • in der while schleife wartet er dann zu lange. ich habe mal die mmVideo->Length auslesen lassen, das sind mehr ms als das originalvideo eigentlich ist, deswegen steht das video, auch wenn es beendet ist, da und wird erst paar sekunden später geschlossen.

    Sleep(1); ist nicht sehr genau, da dabei immer CPU Rechenzeit zwischen den Sleeps benötigt wird umd z.B. deine Abfrage zu überprüfen.

    bei den Rest kann ich dir leider nicht behilflich sein, da ich die TMediaPlayer-Komponente noch nie benutzt habe.



  • Hast du mal den Debugger genutzt um herauszufinden, welche Zeilen durchlaufen werden und welche nicht.

    Mal davon abgesehen, dass die Schleife mit dem Sleep blöd ist, gehört in solche schleifen normalerweise ein "Application->ProcessMessages()", damit visuelle Änderungen der Komponenten dargestellt werden.

    Es kann nämlich sein, dass er dein Label durchläuft und die Caption setzt, aber die Änderung noch nicht dargestellt hat.

    Edit: darf man fragen, wieso du nicht einfach

    Sleep( mmVideo->Length );
    

    machst, wenn du schon sowas unbedingt machen willst?

    Erkundige dich mal über die Events, die der Mediaplayer anbietet.
    Wenn es dort kein geeignetes Event gibt, was ausgelöst wird, wenn das Medium abgespielt wurde, dann nimm lieber eine Timer der jede Sekunde mal prüft ob der Mediaplayer fertig ist oder nicht und ggf. entsprechende Aktionen auslöst.

    Aber die Sleep-Lösung ist nicht sonderlich schön...



  • es gibt ein Wait oder so ähnlich in der Komponente, dadurch spielt er bis zum Ende bis er die darauf folgenden Codezeilen ausführt.

    EDIT ZITAT:

    Die Eigenschaft Wait bestimmt, ob die Steuerung an die Anwendung zurückgegeben wird, bevor die Methode Play vollständig ausgeführt ist. Die Eigenschaft Notify gibt an, ob Play ein OnNotify-Ereignis erzeugt.

    Müsste das sein was du suchst



  • Guten Morgen Leute,

    habe das endlich hinbekommen. Vielen Dank.

    Edit: darf man fragen, wieso du nicht einfach

    Sleep( mmVideo->Length );
    

    Da hast du natürlich recht, der code war hier gar nicht hervorragend. Doch ich hatte da ein wenig rumgespielt und bestimmte funktionen ausprobiert, deswegen hatte ich dann das alles in einer while schleife gebracht.danke für den hinweis!

    es gibt ein Wait oder so ähnlich in der Komponente, dadurch spielt er bis zum Ende bis er die darauf folgenden Codezeilen ausführt.

    genau die habe ich jetzt benutzt, vielen, vielen Dank.

    für interessenten, so sieht der code dann aus:

    Application->ProcessMessages();
                  mmVideo->Wait=true;
                  mmVideo->Play();
                  mmVideo->Stop();
    

    wenn wait auf true ist, so wartet er zwischen zwei methoden. heißt also: er spielt ab und wartet bis der clip zu ende ist, dann erst stoppt er!

    anscheinend wird hierbei auch sleep oder ähnliches benutzt, meine labels wurden nicht angezeigt, dank

    Application->ProcessMessages();
    

    hab ich das dann hinbekommen, an dieser stelle danke für die funktion!

    mfg
    Darkman


Anmelden zum Antworten