![]() |
Zeitcode
Hallo,
03:00:00:12 - 01:00:00:12 = 02:00:00:00 Wie kann ich berechnen? TimeCodeInEdit 01:00:00:00 TimeCodeOutEdit 02:00:00:00 TimeCodeDurationEdit'e Edit2 - Edit1 = 01:00:00:00 S1, S2: TDateTime; begin S1 := StrToTime(Edit1.Text); S2 := StrToTime(Edit2.Text); Edit3.Text := (TimeToStr(S1 - S2)); |
AW: Zeitcode
Wieso machst bu bei jeder Korrektur einen neuen Thread auf?
|
AW: Zeitcode
Was soll denn dies bedeuten: 03:00:00:12?
|
AW: Zeitcode
Ich habe die anderen Threads gelöscht.
|
AW: Zeitcode
Ich würde es so machen. Ist nur eine Idee. Ungetestet.
Die Zeit erst einmal in Sekunden umrechnen (Funktion)
Delphi-Quellcode:
Dann die Differenz berechnen
uses System.TimeSpan;
function TimeToMilliSeconds(TimeString: string): Double; var TimeSpan: TTimeSpan; begin TimeSpan := TTimeSpan.Parse(TimeString); Result := TimeSpan.TotalMilliseconds; end;
Delphi-Quellcode:
DifferenzMilliSekunden := (TimeToMilliSeconds(cIn) - TimeToMilliSeconds(cOut)); Das ist sicherlich auch ganz anders möglich mit TDateTime (StrToDateTime) oder anders. |
AW: Zeitcode
Zitat:
Delphi-Quellcode:
Vorschlagen, damit hast Du die Differenz in Sekunden, die einfach wieder in Std:Min:Sek hochrechnen. Millisekunden besteht aus 4 Ziffern weswegen ich einfach mal von einem Schreibfehler ausgeh.
SecondsBetween(TDateTime1,TDateTime2)
|
AW: Zeitcode
Zitat:
|
AW: Zeitcode
Zitat:
Okay okay, Herr Raabe hat natürlich mal wieder Recht, gerade mal nachgeschaut: Zitat:
|
AW: Zeitcode
Ist mein Vorschlag somit hinfällig?
|
AW: Zeitcode
Zitat:
![]() |
AW: Zeitcode
Da muss man dann aber In und Out erst nach TDateTime umrechnen, was bei einer zweistelligen Millisekunden-Angabe bei mir zu Fehlern führte.
TTimeSpan hingegen läuft durch. |
AW: Zeitcode
Mit 4 ":" hab ich das auch noch nicht gesehn.
Und ob 2 oder 3 ist fast egal, da bei den meisten Formatierungen es als Fraction (Kommastellen an den Sekunden) dargestellt wird. 01:00 01:00:00 01:00:00.120 Und StrToTime kann sowas standardmäßig nicht richtig dekodieren. Eventuell kann man es über StrToTime mit einem passenden FormatSetting für das LongTimeFormat ausgelesen bekommen, aber die Date-/TimeFormate werden nur bedingt zum auslesen verwendet. (Designfehler) Und Ja, Delphi nimmt vorwiegend nur 3-stellige Millisekunden (ZZZ) Bei weniger als 3 Stellen muß man aufpassen, da es von fehlenden Leading-Zeros ausgeht. ![]() |
AW: Zeitcode
Stunden, Minuten, Sekunden, Rahmenberechnung
Hours, Minutes, seconds, frames - Hours, Minutes, seconds, frames = 01:00:00:00 :?::?::?: |
AW: Zeitcode
Zitat:
Delphi-Quellcode:
function MilliSecondsBetween(const ANow, AThen: TDateTime): Int64;
|
AW: Zeitcode
Sorry habe mich falsch ausgedrückt. Ich meinte natürlich die beiden Edits vom Themenersteller. Die nennt er/sie In und Out.
|
AW: Zeitcode
Zitat:
HH:MM:SS.ZZZ (000..999) also SS.ZZ ist SS.0ZZ (00.50 aka 50ms), aber nicht SS.ZZ0 (00.50 aka 500ms) Wenn es etwas Anderes sein soll, dann kann TimeToStr, StrToTime, FormatDateTime und Co. nicht verwendet werden. Maximal den "Frame" abtrennen, den Rest mir den Standardroutinen umrechnen und die Frames als Millisekunden nach/vor der Konvertierung dazurechnen/abziehen. ![]() |
AW: Zeitcode
Mein Vorschlag an TE:
Ändere die Edit.Texte in dieses Format 00:00:00.000, danach sowas hier
Delphi-Quellcode:
Das ergibt erstmal die Differenz in MilliSekunden. Sorry, nur QnD hier im Editor geschrieben = ungetestet.
function BerechneEditFelder ( S1, S2: String ): Int64;
var t1, t2: TDateTime; begin try t1 := StrToTime( S1 ); t2 := StrToTime( S2 ); finally Result := MilliSecondsBetween ( t1, t2 ); end; end; Wie werden "Frames" bei Dir definiert? edit so hier Aufrufen falls das unklar ist:
Delphi-Quellcode:
Int64Dummy := BerechneEditFelder(Edit1.Text, Edit2.Text)
edit2 oder, um im TDateTime zu bleiben so hier
Delphi-Quellcode:
Nun solltest Du die Differenz als TDateTime bequem abrufen können.
function BerechneEditFelder ( S1, S2: String ): TDateTime;
var t1, t2: TDateTime; begin try t1 := StrToTime( S1 ); t2 := StrToTime( S2 ); finally Result := MilliSecondsBetween(t1, t2) / (1000.0 * 86400); end; end; |
AW: Zeitcode
Zitat:
Delphi-Quellcode:
function BerechneEditFelder(S1, S2: String): TDateTime;
var t1, t2: TDateTime; begin try t1 := StrToTime(S1); t2 := StrToTime(S2); finally result := MilliSecondsBetween(t1, t2) / (1000.0 * 86400); end; end; es gibt einen Fehler : Hata:: Hata:: Hata:: |
Delphi-Quellcode:
procedure TForm1.DurationClick(Sender: TObject);
begin Duration.Text := TimeToStr(BerechneEditFelder('01:00:00:00', '01:00:00:00')); end; in Ordnung : Başparmak:
Delphi-Quellcode:
procedure TForm1.PGDurationClick(Sender: TObject);
begin Duration.Text := TimeToStr(BerechneEditFelder('01:00:00', '01:00:00')); end; |
AW: Zeitcode
No Google Translate on this website please. Programming with an English-based programming language doesn't make any sense if you don't speak English.
|
AW: Zeitcode
Zitat:
|
AW: Zeitcode
FormatSettings hat gefehlt, so klappt es, ich habe es getestet mit Delphi 2009.
Delphi-Quellcode:
In diesem Beispiel ist Duration.Text = 223
function GetMillisecondSpan(S1, S2: String): Int64;
var t1, t2: TDateTime; FS: TFormatSettings; begin GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FS); FS.DecimalSeparator := '.'; FS.TimeSeparator := ':'; FS.LongTimeFormat := 'hh:nn:ss.zzz'; try t1 := StrToTime(S1, FS); t2 := StrToTime(S2, FS); finally Result := MilliSecondsBetween(t1, t2); end; end; procedure TForm1.DurationClick(Sender: TObject); begin Duration.Text := IntToStr(GetMillisecondSpan('01:23:45.678', '01:23:45.901')); end;
Delphi-Quellcode:
In diesem Beispiel ist Duration.Text = 00:00:00.223
function GetDateTimeSpan ( S1, S2: String ): TDateTime;
var t1, t2: TDateTime; FS: TFormatSettings; begin GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FS); FS.DecimalSeparator := '.'; FS.TimeSeparator := ':'; FS.LongTimeFormat := 'hh:nn:ss.zzz'; try t1 := StrToTime(S1, FS); t2 := StrToTime(S2, FS); finally Result := MilliSecondsBetween(t1, t2) / (1000.0 * 86400); end; end; procedure TForm1.DurationClick(Sender: TObject); var FS: TFormatSettings; begin GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FS); FS.DecimalSeparator := '.'; FS.TimeSeparator := ':'; FS.LongTimeFormat := 'hh:nn:ss.zzz'; Duration.Text := TimeToStr(GetDateTimeSpan('01:23:45.678','01:23:45.901'), FS); end; Ich hoffe nun ist dieser Thread zufriedenstellend erledigt. |
AW: Zeitcode
Zitat:
Zitat:
![]() Gruß K-H |
AW: Zeitcode
Zitat:
|
AW: Zeitcode
Zitat:
Strg+C in Dialogen und Strg+V hier im Texteditor helfen, wenn man nocht abschreiben oder auf den Monitor schießen möchte. Und ansonsten hatte ich schon alles gesagt, was die "Frames" oder sonstwas betrifft, welches keine Millisekunden sind, sowie zum Format der Datums-String. |
AW: Zeitcode
Zitat:
Danke. : Başparmak: |
AW: Zeitcode
Zitat:
|
AW: Zeitcode
Jetzt möchte ich aber doch schon noch wissen, wie lang so ein Frame denn nun ist bzw. wie viele es davon in einer Sekunde gibt.
|
AW: Zeitcode
75 Frames sollten 1 sec sein wenn ich mich recht erinnere.
Başparmak = :thumb: Gruß K-H |
AW: Zeitcode
Zitat:
Zitat:
Je nach Interpretation der Frames als Milli- oder Zentisekunden kommt da aber 00:00:00.999 oder 00:00:00.990 raus. Nur wenn man die Frames vorher in 1/75 Sekunden umrechnet passt das Ergebnis - bis auf die dabei entstehenden Rundungsfehler. |
AW: Zeitcode
Nur wenn Frames sich auf Audio-CD bezieht. Schaut mal hier:
![]() |
AW: Zeitcode
Da wir nicht wissen in welchem Kontext die Frage steht, sind alle "Lösungen" spekulativ.
Gruß K-H |
AW: Zeitcode
Um Rundungsfehler zu vermeiden, würde ich mit Sekunden und Frames rechnen. Wenn die maximale Anzahl der FPS überschritten wird, muss der Übertrag berücksichtigt werden.
Diese Lösung sollte mit allen Timecodes funktionieren die ganzzahlige fps haben (also z.B. nicht 23.976fps). Man muss lediglich die Konstante fps anpassen.
Delphi-Quellcode:
Ausgabe
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses Types, SysUtils, Math, StrUtils; type TCDTimecode = record h, m, s, f: Word; neg: Boolean; function GetSeconds: Integer; // h, m, s => seconds procedure SetSeconds(Seconds: Integer); procedure Add(const t: TCDTimecode); function GetAsString: String; procedure SetAsString(const tc: String); end; { TCDTimecode } procedure TCDTimecode.Add(const t: TCDTimecode); const fps = 75; var s: Integer; f: Integer; begin s := Self.GetSeconds + t.GetSeconds; f := Self.f; if Self.neg then f := -f; if t.neg then dec(f, t.f) else inc(f, t.f); if f<0 then begin inc(f, fps); dec(s); // Carry end else if f>=fps then begin dec(f, fps); inc(s); // Carry end; SetSeconds(s); Self.f := Word(f); end; function TCDTimecode.GetAsString: String; const sign: array [Boolean] of String = ('+', '-'); begin Result := Format('%s%.2d:%.2d:%.2d:%.2d', [sign[neg], h, m, s, f]) end; function TCDTimecode.GetSeconds: Integer; begin Result := h * SecsPerHour + m * SecsPerMin + s; if neg then Result := -Result; end; procedure TCDTimecode.SetAsString(const tc: String); var List: TStringDynArray; t: Integer; begin List := SplitString(tc, ':'); if length(List) = 4 then begin t := StrToInt(List[0]); neg := t<0; h := abs(t); m := StrToInt(List[1]); s := StrToInt(List[2]); f := StrToInt(List[3]); end else raise Exception.CreateFmt('invalid timecode "%s"', [tc]); end; procedure TCDTimecode.SetSeconds(Seconds: Integer); begin neg := Seconds<0; divmod(Cardinal(abs(Seconds)), SecsPerHour, h, m); divmod(Cardinal(m), SecsPerMin, m, s); end; var t1, t2: TCDTimecode; begin try t1.SetAsString('03:00:00:12'); t2.SetAsString('-01:00:00:12'); t1.Add(t2); writeln(t1.GetAsString); t1.SetAsString('03:00:00:12'); t2.SetAsString('-01:00:00:13'); t1.Add(t2); writeln(t1.GetAsString); readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. +02:00:00:00 +01:59:59:74 |
AW: Zeitcode
Zitat:
|
AW: Zeitcode
Zitat:
Bei Musik-CDs hat Frames meines Erachtens nur Sinn wenn CD eine non-Stop CD ist (übergangsfreie Trackwechsel / Mix-CD). Bei Videos hat Frames Einfluss auf die aktuelle Position zwischen den einzelnen Sekunden/Millisekunden, abhängig wie das Video kodiert ist. Also gilt nach wie vor erst mal zu klären: Zitat:
Zitat:
Zitat:
|
AW: Zeitcode
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Falls jemand braucht, für ältere Delphi Versionen die noch kein SplitString() haben, im Anhang ist angepasstes Projekt. Ps: TStrings mit ExtractStrings() habe ich verwendet. |
AW: Zeitcode
Manchmal denke ich einfach zu kompliziert. Wenn man gleich mit fps arbeitet, wird es einfacher (man bekommt aber auch früher einen Überlauf: ab so rund 16000h 8000h):
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses Types, SysUtils, Math, StrUtils; type TCDTimecode = record Frames: Integer; function GetAsString: String; procedure SetAsString(const tc: String); end; const fps = 75; FramesPerHour = SecsPerHour * fps; FramesPerMin = SecsPerMin * fps; { TCDTimecode } function TCDTimecode.GetAsString: String; const sign: array [Boolean] of String = ('+', '-'); var t: Cardinal; h, m, s, f: Word; neg: Boolean; begin neg := Frames<0; t := abs(Frames); h := t div FramesPerHour; dec(t, h * FramesPerHour); divmod(t, FramesPerMin, m, s); divmod(Cardinal(s), fps, s, f); Result := Format('%s%.2d:%.2d:%.2d:%.2d', [sign[neg], h, m, s, f]) end; procedure TCDTimecode.SetAsString(const tc: String); var List: TStringDynArray; begin List := SplitString(tc, ':'); if length(List) = 4 then begin Frames := StrToInt(List[0]); Frames := Frames * MinsPerHour + StrToInt(List[1]); Frames := Frames * SecsPerMin + StrToInt(List[2]); Frames := Frames * fps + StrToInt(List[3]); end else raise Exception.CreateFmt('invalid timecode "%s"', [tc]); end; var t1, t2: TCDTimecode; begin try t1.SetAsString('03:00:00:12'); t2.SetAsString('01:00:00:12'); dec(t1.Frames, t2.Frames); writeln(t1.GetAsString); t1.SetAsString('03:00:00:12'); t2.SetAsString('01:00:00:13'); dec(t1.Frames, t2.Frames); writeln(t1.GetAsString); readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. |
AW: Zeitcode
Liste der Anhänge anzeigen (Anzahl: 1)
Danke an samso, Anhang angepasst für ältere Delphis.
|
AW: Zeitcode
Zitat:
Delphi-Quellcode:
.
Int64
|
AW: Zeitcode
Klar kann man machen.. Meine Bemerkung war eher ironisch gemeint. Wer braucht schon einen Zeitcode mit 8000h (bei CD-Timecode?)?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz