Autor Beitrag
jackie05
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Fr 27.03.09 18:03 
Hallo,
ich möchte bei MediaPlayer1 die aktuelle Zeit anzeigen lassen, ich habe das folgendermaßen versucht:

ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 27.03.09 18:12 
Worauf hast du denn TimeFormat eingestellt?
jackie05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 27.03.09 18:44 
user profile iconjackie05 hat folgendes geschrieben Zum zitierten Posting springen:
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 :zustimm:
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:
ausblenden 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 :zustimm:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
jackie05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Sa 28.03.09 16:35 
Vielen Dank für die Mühe.

Ich habe das einfacher gelöst:
ausblenden volle Höhe Delphi-Quelltext
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
  //Aktuelle Zeit berechnen
  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) + ' / ';

  //Gesamtzeit berechnen
  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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 28.03.09 16:40 
user profile iconjackie05 hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe das einfacher gelöst:
Ich auch, ich auch: :D
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
function Spieldauer(MinPos, MaxPos: Integer): String;
begin
  Result := Format('%.2d:%.2d / %.2d:%.2d', [(MinPos div 1000) div 60, (MinPos div 1000) mod 60, 
    (MaxPos div 1000) div 60, (MaxPos div 1000) mod 60]));
end;
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 28.03.09 16:43 
user profile iconjackie05 hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe das einfacher gelöst: [36 Zeilen code]
ausblenden Delphi-Quelltext
1:
2:
3:
4:
MPlayer.TimeFormat := tfHMS;
Sec := MPlayer.Position and 255;
Min := (MPlayer.Position shr 8) and 255;
Hours := (MPlayer.Position shr 16) and 255;
:gruebel:
Ja, Format ist sicher die tolligste Lösung :|

Edit: Ok, ok, klappt nicht, ich denk nochmal nach :motz:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.


Zuletzt bearbeitet von JayEff am Sa 28.03.09 16:49, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Sa 28.03.09 16:47 
Das ist natürlich besser und übersichtlicher. :D
Ich werde das dann bevorzugen und ein Paar zeilen Code gespart.

Vielen Dank.

MfG
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 28.03.09 17:01 
So hier geht's richtiger:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
  function byte2time(b : Byte; hours: Boolean = False): Byte;
  begin //byte ist von 0-255, also ist 255=59 sekunden. Man rechnet um durch:
    if not Hours then 
      result := (b * 59) shr 8 //(byte/255)*59 für minuten/sekunden
    else
      result := (b * 23) shr 8 //(byte/255)*23 für Stunden
  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 :zustimm:
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.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.