| Autor |
Beitrag |
jackie05
      
Beiträge: 357
|
Verfasst: Fr 27.03.09 18:03
Hallo,
ich möchte bei MediaPlayer1 die aktuelle Zeit anzeigen lassen, ich habe das folgendermaßen versucht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.Timer1Timer(Sender: TObject); var tmpstr : string; x: integer; begin TrackBar1.Position := MediaPlayer1.Position; tmpstr:=''; x := MediaPlayer1.Position; if (x div 60)<10 then tmpstr := '0' + InttoStr(x DIV 60) + ':' else tmpstr := InttoStr(x DIV 60) + ':';
if (x mod 60)<10 then tmpstr := tmpstr + '0' + inttostr(x mod 60) else tmpstr:=tmpstr + inttostr(x mod 60);
Label2.Caption:=tmpstr; end; |
Timer1: Interval auf 1
Wenn ich jetzt ein Video abspiele, dann zuckt der Film jede 1 Millisekunde oder wenn ich Interval auf 1000 einstelle, dann zuckt der Film jede 1 Sekunde u.s.w.
Das liegt in dieser Zeile:
Delphi-Quelltext 1:
| TrackBar1.Position := MediaPlayer1.Position; |
Wie könnte ich es anders lösen?
Ich möchte die aktuelle Zeit und die länge des Videos anzeigen:
00:00 / 00:00
Ich bedanke mich schonmal im Voraus.
MfG
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 27.03.09 18:12
Worauf hast du denn TimeFormat eingestellt?
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: Fr 27.03.09 18:28
Überhaupt nicht.
Ich habe jetzt eine andere Komponent installiert und habe statt TrackBar1 TJvSlider1 genommen und jetzt zuckt es nicht mehr.
Wie kann ich jetzt die Richtige Zeit anzeigen?
MM:SS / MM:SS
Danke schonmal für die Hilfe.
MfG
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 27.03.09 18:44
jackie05 hat folgendes geschrieben : | | Wie kann ich jetzt die Richtige Zeit anzeigen? |
| Delphi-Hilfe: | Die Eigenschaft Position legt die aktuelle Position im geladenen Medium fest.
Beschreibung
Die Angabe von Position erfolgt im aktuellen Zeitformat, das in der Eigenschaft TimeFormat festgelegt ist.
Position wird standardmäßig auf den Anfang des Mediums gesetzt. Wenn das Medium mehrere Spuren unterstützt, wird Position per Vorgabe auf den Anfang der ersten Spur gesetzt. |
Und zu TimeFormat:
| Zitat: | Die Eigenschaft TimeFormat legt das Format für die Angabe von Positionsinformationen fest.
Beschreibung
TimeFormat bestimmt, wie die Eigenschaften StartPos, Length, Position, Start und EndPos interpretiert werden. Ist beispielsweise Position auf 180 und TimeFormat auf tfMilliseconds gesetzt, befindet sich die aktuelle Position 180 Millisekunden vom Anfang des Mediums entfernt. Wenn dagegen Position auf 180 und TimeFormat auf tfMSF gesetzt ist, befindet sich die aktuelle Position 180 Minuten vom Anfang des Mediums entfernt.
Die möglichen Formate werden nicht von allen Multimedia-Geräten unterstützt. Wenn Sie versuchen, ein nicht unterstütztes Format zu setzen, wird die Zuweisung ignoriert.
Die aktuelle Zeitinformation wird immer in einem 4-Byte-Integer übergeben. Bei einigen Formaten wird die Zeitinformation nicht als ein einzelner Integer zurückgegeben, sondern in Form eines langen Integers, der Informationen aus einzelnen Bytes enthält. |
Und Last but not Least zu | TMPTimeFormats: | [...irrelevantes...]tfHMS:
Stunden, Minuten und Sekunden werden in einem 4-Byte-Integer gespeichert. Die Datenwerte lauten (vom niederwertigsten zum höherwertigsten Byte):
Stunden (niederwertigstes Byte)
Minuten
Sekunden
Nicht benutzt (höherwertigstes Byte)
[...] |
Das sollte reichen um dein Problem zu lösen
Edit:
Ok noch ein Tipp zum aufspalten in Stunden/Minuten/Sekunden: Ein Byte = 8 bit, richtig? ein 4 Byte Integer sieht also so aus:
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx mit x ist ne 1 oder 0. um die ganz linken 8 bit zu bekommen, nutzt du den logischen Und-Operator und eine Maske:
Quelltext 1: 2: 3: 4:
| xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx (dein Position) and 00000000 00000000 00000000 11111111 (2^8-1 = 255) ======================================= 00000000 00000000 00000000 xxxxxxxx |
Also bekommst du Sekunden := Position and 255;
Ähnlich gehst du für Minuten vor, nur verschiebst du die Zahl vorher 8 bit nach rechts mit dem Operator shr: Minuten := (Position shr 8) and 255;
PS: Das ist ungetestet und ich vermute, dass es einfachere Wege gibt, aber das Prinzip sollte stimmen 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: Sa 28.03.09 16:35
Vielen Dank für die Mühe.
Ich habe das einfacher gelöst:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| function Spieldauer(MinPos: integer; MaxPos: integer): string; var Min,Sek: integer; Zeit: integer; tmpZeit: string; begin Zeit := MinPos; Min := (Zeit div 1000) div 60; Sek := (Zeit div 1000) mod 60; if (Min < 10) then tmpZeit := '0' + IntToStr(Min) else tmpZeit := IntToStr(Min);
if (Sek < 10) then tmpZeit := tmpZeit + ':0' + IntToStr(Sek) + ' / ' else tmpZeit := tmpZeit + ':' + IntToStr(Sek) + ' / ';
Zeit := MaxPos; Min := (Zeit div 1000) div 60; Sek := (Zeit div 1000) mod 60; if (Min < 10) then tmpZeit := tmpZeit + '0' + IntToStr(Min) else tmpZeit := tmpZeit + IntToStr(Min);
if (Sek < 10) then tmpZeit := tmpZeit + ':0' + IntToStr(Sek) else tmpZeit := tmpZeit + ':' + IntToStr(Sek);
result := tmpZeit; end; |
TimeFormat von MediaPlayer habe ich auf Millisekunden eingestellt und dann rufe ich diese Funktion auf und übergebe die Zeit in Label1:
Delphi-Quelltext 1:
| Label1.Caption := Spieldauer(Mediaplayer1.Position,Mediaplayer1.Length); |
Das sieht z.B. dann so aus:
00:00 / 03:54
Und vielen Dank für die antworten.
MfG
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 28.03.09 16:40
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Sa 28.03.09 16:43
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Zuletzt bearbeitet von JayEff am Sa 28.03.09 16:49, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 28.03.09 16:45
Ja, das mit dem TimeFormat tfHMS wollte ich eben auch noch hineineditieren, mit dem reinen shiften statt der Integerdivision ist das natürlich deutlich schneller. 
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: Sa 28.03.09 16:47
Das ist natürlich besser und übersichtlicher.
Ich werde das dann bevorzugen und ein Paar zeilen Code gespart.
Vielen Dank.
MfG
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Sa 28.03.09 17:01
So hier geht's richtiger:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function byte2time(b : Byte; hours: Boolean = False): Byte; begin if not Hours then result := (b * 59) shr 8 else result := (b * 23) shr 8 end; begin mpl.TimeFormat := tfHMS; Sec := byte2time((mpl.Position shr 8) and 255); Min := byte2time((mpl.Position shr 16) and 255); Hours := byte2time((mpl.Position shr 24) and 255, true); |
So müsst's jetzt ... besser sein ... Immernoch 2/3 weniger Zeilen
Edit: Label_Spieldauer.Caption := Format('%.2d:%.2d / %.2d:%.2d', [Min, Sec, MaxMin, MaxSec]); wobei MaxMin/Sec natürlich deine Maximumsdinger sind, woher auch immer die kommen.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
|