Mal wieder konstantes Timing *gelöst*
Übersicht

![]() |
EPSBetreff: Mal wieder konstantes Timing *gelöst* |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Weder noch ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie machen es dann andere Player ?
Vlt kanst was von denen "abgucken" ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
EPS |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
perfekt, danke! | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
EPS |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group