Mal wieder konstantes Timing *gelöst*

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

EPS

Betreff: Mal wieder konstantes Timing *gelöst*

BeitragMo, Okt 13, 2008 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi zusammen, ich hab grad mal wieder den totalen Knoten im Hirn. Folgendes Problem:

Es geht darum eine folge von Bildern, sagen wir mal ein Video, in einer präzisen Framerate anzuzeigen.

Die Anzeige selbst ist ein BB-Image und soll in der Hauptschleife so oft wie möglich passieren. Die Aktualisierung des Bildinhalts soll (logischerweise) in Abhängigkeit der Framerate erfolgen (z.B. 25FPS oder 23.397 FPS usw.).

Das Problem ist das das ganze natürlich mächtig prüzise sein muß damit es synchron zum Ton läuft und das das kopieren des Videobildes in das BB-Image einige Zeit benötigt.

Das einzige was mir hierbei in den Sinn kommt wäre eine Art DeltaTiming - welches den "Frameoffset" berechnet - kombiniert mit einem WaitTimer oder etwas in der Art - der bestimmt wann der Frame neu berechnet und kopiert wird. Aber ich bekomme es einfach nicht gebacken.

Zum besseren Verständnis hier mal ne grobe Anordnung wie ich es mir vorstelle:

Repeat
cls

IF Zeit für nächsten Frame?
Offset = berechnet aus verstrichener Zeit
Frame = Frame + ( 1 + Offset )
Kopiere Videobild in BB-Image
END IF

DrawBlock VideoBild
Flip
Forever


ICH BEDANKE MICH SCHONMAL IM VORFELD - EPS
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.
  • Zuletzt bearbeitet von EPS am Di, Okt 14, 2008 10:37, insgesamt einmal bearbeitet

Noobody

BeitragMo, Okt 13, 2008 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Damit man das Problem genauer erfassen kann, musst du auch sagen, um was es sich handelt.
Ist es nun ein gewöhnliches Bild mit mehreren Frames, dann ist die Lösung relativ simpel (obwohl man dazu die FPS des Videos kennen muss).

Code: [AUSKLAPPEN]
Const FPS = 25

Global StartTimer = MilliSecs()

Repeat
   Cls
   
   Frame = Floor( ( MilliSecs() - StartTime )*FPS*0.001 )
   
   DrawBlock Bild, 0, 0, Frame
   Flip
Forever


Handelt es sich um ein Video, ist das auch kein Problem, da:
Command Reference hat Folgendes geschrieben:
When playing MPEG or AVI files, the movie is played back at normal speed 'behind the scenes', and DrawMovie simply draws the most recent frame.


Sprich, Blitz übernimmt das Timing selbst.

Handelt es sich nun aber um eine GIF - Animation, wo man sich um das Timing selbst kümmern muss, fällt mir auf die schnelle nichts ein.
Man könnte höchstens jedes Frame des GIFs in ein Bild reinzeichnen und später das ganze ohne DrawMovie abwickeln, sondern mit der ersten Lösung.
Ich hoffe, ich konnte dir helfen.

EDIT: Habe wohl den Teil überlesen, dass es sich um ein BB - Image handelt.
Das heisst, der erste Vorschlag wäre wohl angebracht.

EPS

BeitragMo, Okt 13, 2008 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Weder noch Smile

Ich schreibe gerade eine Bibliothek für die Wiedergabe von AVI Dateien. Das Abspielen eines Videos klappt schon super und funktionert nach dem Prinzip das ich einen Videoframe per Framenummer in ein BB-Image kopiere.

Die performance hab ich so weit nach oben geschraubt, das ich selbst ein HD Video abspielen kann - im Fenstermodus mit Debugger - das ist also nicht das Thema. Logischerweise ist mir auch die FrameRate bekannt.

Nun arbeite ich daran den Sound mit auszugeben, nur scheitere ich hierbei an einer exakten Synchronisation des Videos.

Bis jetzt hab ich es einfach mit WaitTimer() gemacht, das ginge im Prinzip auch, nur stoppt dies die gesamte Hauptschleife - was unbrauchbar ist, z.B. wenn man mehrere Videos mit unterschiedlicher Framerate wiedergibt (ja, auch das geht, allerdings dann nicht mehr in HD)

Also suche ich nach einer Timing-Möglichkeit.
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

EPS

BeitragMo, Okt 13, 2008 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry für's pushen, hat keiner ne Idee -wäre wirklich wichtig? DANKE
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

SpionAtom

BeitragMo, Okt 13, 2008 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Du willst einen Ersatz für Waittimer, der das Programm nicht anhält?
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

EPS

BeitragDi, Okt 14, 2008 1:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Sowas in der Art - ja.
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

ozzi789

BeitragDi, Okt 14, 2008 7:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst dus nicht einfach mit

Code: [AUSKLAPPEN]
If millisecs()>time+framerate
time=millisecs()
frame=frame+1
endif



machen ?



mfg
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

EPS

BeitragDi, Okt 14, 2008 7:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Diese Art "Timer" benutze ich in der Tat um festzustellen zu welchem Zeitpunkt der nächste Frame kommt und bereitgestellt werden muß - also für den "Frame = Frame + 1" Teil.

Jedoch ist dieses Timing zu ungenau um es synchron zum Ton zu halten. Daher müsste (in meinen Augen) noch ein zweiter Timer mitlaufen der ein Delta# bestimmt so das es eher "Frame = Frame + 1 * Delta#" heißt um Ungenauigkeiten auszugleichen.

Leider bekomme ich es in der Praxis aber nicht hin das Delta# so zu berechnen das es zur Framerate des Video's passt.
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Okt 14, 2008 8:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Ungenauigkeit kommt durch Rundungsfehler. Das könnte klappen, wenn timer ein Float ist und die Berechnung etwas anders gestalltet wird.

Code: [AUSKLAPPEN]
ms%=millisecs()
   If ms%>time#
   time=time+framerate#
   frame=frame+1
endif


Die Ungenauigkeiten zwischen den einzelnen Frames und den Bildschirmaufbau kann man so nicht verhindern. Das wäre aber maximal +/- 0.5 Frames.

Wenn man nichts anderes anzuzeigen hat, kann man auch den gesamten Ablauf innerhalb dieser Abfrage durchführen. Also innerhalb ein Flip durchführen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

EPS

BeitragDi, Okt 14, 2008 9:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Das dachte ich zunächst auch und hatte es auch schon mit Floats versucht - leider reicht dies jedoch nicht und es ist (leider) wesentlich mehr als 0.5 Frames.
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

DAK

BeitragDi, Okt 14, 2008 10:28
Antworten mit Zitat
Benutzer-Profile anzeigen
könnte dir das hier vll helfen?

Code: [AUSKLAPPEN]
fps# = 23.397

startms = MilliSecs()
While Not KeyHit(1)
   framereal# = fps#*(MilliSecs()-startms)
   framereal# = framereal#/1000
   frame = Int(framereal)
Wend


Berechnet zwar jedes Frame die aktuelle Video-Framenummer neu, dafür sollts FPS-unabhängig laufen und relativ genau sein...

(habs nicht ausprobiert, sondern nur so runter geschrieben. Keine Garantie, dass es wirklich läuft)

Edit: oha, sry, hab grad gesehen, dass Nobody quasi das selbe geschrieben hat... sry4selbe Lösung noch mal raus haun...
Gewinner der 6. und der 68. BlitzCodeCompo

ozzi789

BeitragDi, Okt 14, 2008 10:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie machen es dann andere Player ?
Vlt kanst was von denen "abgucken" Wink
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

EPS

BeitragDi, Okt 14, 2008 10:36
Antworten mit Zitat
Benutzer-Profile anzeigen
DAK du bist ein Engel....genau das isses.

Ich hab es noch etwas angepasst um den Framewechsel zu erkennen, aber so klappt es PERFEKT.

Ich bedanke mich bei Dir - aber natürlich auch bei allen anderen.
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

DAK

BeitragDi, Okt 14, 2008 10:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Engel, naja^^

aber hab gern geholfen, auch wenn eig Nobody früher schon mit fast der gleichen Lösung gekommen ist...

Die Lib, die du da machst, wirst du die (kostenlos?) veröffentlichen oder nur für eigene Projekte verwenden? Ich könnt sowas nämlich vll brauchen, in der nächsten Zeit.
Gewinner der 6. und der 68. BlitzCodeCompo

EPS

BeitragDi, Okt 14, 2008 10:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Wird kostenlos. Sobald alles richtig funzt kommt sie ins Code Archiv.
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

DAK

BeitragDi, Okt 14, 2008 10:55
Antworten mit Zitat
Benutzer-Profile anzeigen
perfekt, danke!
Gewinner der 6. und der 68. BlitzCodeCompo

EPS

BeitragDo, Okt 23, 2008 9:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Lib befindet sich jetzt im Codearchiv. Viel Spaß damit.
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group