Delay zwischen Tastatureingabe und Anwendung (M$ Mediaplayer classic)?



  • Hallo,

    für mein Experiment (http://www.c-plusplus.net/forum/299644) habe ich mittlerweile eine Passable Anwednung gefunden: den Mediaplayer Classic. Der hält keine Pause zwischen den Videoneustarts.

    Dieser soll ein video mit 16 Bilden innerhalb von 0,012 Sekunden (Länge ist gleich Periodendauer) abspielen. Bislang scheinen meine trägen Augen diesen Player als den schnellsten zu empfinden.

    Nun soll er das Video Neustarten (Periodendauer = 0,012 s) wenn ich die F-Taste Drücke. An meiner Tastatur (USB) klappt das schon. Leider sind nicht nur meine Augen sondern auch mein Brain zu träge um Millisekunden zu zählen.

    Eine Messmethode fällt mir spontan nicht ein, darum frag ich mal hier, ob jemand vielleicht Erfahrungswerte eines solchen Eingabedelay hat und wovon der Delay abhängt. Wie kann man ihn weiter reduzieren?

    lg



  • Das wird wohl am Player liegen.

    Ich denke der wird das Video erst einmal cachen... .

    Dieser soll ein video mit 16 Bilden innerhalb von 0,012 Sekunden (Länge ist gleich Periodendauer) abspielen.

    Warum soll der Player 16 Bilder in 0.012 Sekunden abspielen?
    Dann müßte der Player ja 1333 Bilder die Sekunde abspielen 😮
    Mal in Worten: 16 Bilder in 12 tausendstel Sekunden!!

    (Ich denke mal hier stimmt was nicht... solch kurze Zeiten sollten nichtmal zu sehen sein)

    Außerdem kommst du mit solchen Zeiten eh an die Genauigkeitgrenzen des Windows Timers.



  • Danke für den Hinweis mit dem Timer.

    Ich habe jetzt mal nachgerechnet und ich muss mich auch wohl im ersten Schritt auf eine Periode von 0,27 s mit 16 bildern beschränken. Ergo knapp 60 Hz.

    Müsste nur noch hinbekommen, dass es zu keinem framedrop kommt wenn das bild von der grafikkarte neu aufgebaut wird. Gibs da auch sowas wie ein Vsync?

    Wie eng kann ich denn bei dem Windowstimer praktisch kalkulieren? Würde Linux sich dabei besser schlagen?



  • Naja,

    ich denke der Ruckler wird immer zu sehen sein, weil der Player ja auch noch Initialisierungen macht. Eventuel gehts mit einem eigenen Player, bei dem man die Initialisierugen selbst kontrollieren kann.

    Vieleicht hilft sowas:
    http://nehe.gamedev.net/tutorial/playing_avi_files_in_opengl/23001/



  • du bist mein Held!

    er läuft schonmal. hab mir den Code angeschaut und ich kann da keine "start" sequenz sehen. er läuft nur in der endlosschleife.

    Ich möchte aber auf Tastendruck, dass der das Video unterbricht und verzögerungsfrei neu anfängt.

    Hat jemand Rat?

    Hier ein Auszug des Quellcodes für die befehlstasten E, Space und B:

    void Update (DWORD milliseconds)								// Perform Motion Updates Here
    {
    	if (g_keys->keyDown [VK_ESCAPE] == TRUE)					// Is ESC Being Pressed?
    	{
    		TerminateApplication (g_window);						// Terminate The Program
    	}
    
    	if (g_keys->keyDown [VK_F1] == TRUE)						// Is F1 Being Pressed?
    	{
    		ToggleFullscreen (g_window);							// Toggle Fullscreen Mode
    	}
    
    	if ((g_keys->keyDown [' ']) && !sp)							// Is Space Being Pressed And Not Held?
    	{
    		sp=TRUE;												// Set sp To True
    		effect++;												// Change Effects (Increase effect)
    		if (effect>3)											// Over Our Limit?
    			effect=0;											// Reset Back To 0
    	}
    
    	if (!g_keys->keyDown[' '])									// Is Space Released?
    		sp=FALSE;												// Set sp To False
    
    	if ((g_keys->keyDown ['B']) && !bp)							// Is 'B' Being Pressed And Not Held?
    	{
    		bp=TRUE;												// Set bp To True
    		bg=!bg;													// Toggle Background Off/On
    	}
    
    	if (!g_keys->keyDown['B'])									// Is 'B' Released?
    		bp=FALSE;												// Set bp To False
    
    	if ((g_keys->keyDown ['E']) && !ep)							// Is 'E' Being Pressed And Not Held?
    	{
    		ep=TRUE;												// Set ep To True
    		env=!env;												// Toggle Environment Mapping Off/On
    	}
    
    	if (!g_keys->keyDown['E'])									// Is 'E' Released?
    		ep=FALSE;												// Set ep To False
    
    	angle += (float)(milliseconds) / 60.0f;						// Update angle Based On The Timer
    
    	next+=milliseconds;											// Increase next Based On The Timer
    	frame=next/mpf;												// Calculate The Current Frame
    
    	if (frame>=lastframe)										// Are We At Or Past The Last Frame?
    	{
    		frame=0;												// Reset The Frame Back To Zero (Start Of Video)
    		next=0;													// Reset The Animation Timer (next)
    	}
    


  • Ich habe leider keine Zeit den ganzen Code anzusehen.

    Aber wenn es eine Endlosschleife gibt, dann mußt du beim Tastendruck eine Variable setzen und in der Unendlichschleife abfragen, ob die Taste gedrückt ist oder nicht. Wenn sie gedrückt ist zeichnen und sonst einfach nichts tun.



  • Leider weiß ich gar nich wie open GL videos behandelt.

    ich kannn ämlich im code keine endlosschleife finden.

    ich frag mal im c++ fachforum genauer nach. dank dir!


Anmelden zum Antworten