Moin,
Aber Du kennst noch eine Möglichkeit dies mit einer Abfrage geschehen zu lassen? Ist dies kompliziert?
Was ich mir dachte, ist an sich nicht kompliziert. Inzwischen ist mir aber eine Alternative eingefallen.
In AHK gibt es die interne Variable
A_TickCount. Sie enthält die Zeit in
Millisekunden, die seit dem Start des Systems verstrichen ist. Es sollte deshalb reichen, in der Log-Datei den aktuellen Wert von
A_TickCount zu speichern.
Weil Du die Dauer der Einblendung ohnehin aus den Differenzen der Einträge des aktuellen und des folgenden Log-Satzes bildest, könntest Du dann die Millisekunden direkt aus den Werten der Log-Sätze berechnen, d.h. auf die Funktion
ConvertToMilliseconds() vollständig verzichten.
Wenn Du das änderst, wäre es gut, wenn bereits die Anzeige der ersten Einblendung protokolliert wird, im Beispiel "Bitte schalten Sie Ihr Mobiltelefon ab. Vielen Dank!" (falls Du das nicht sowieso machst). Außerdem ist es besser, wenn auf dem Rechner die Windows "Schnellstartoption" nicht aktiv ist (wird unter Win 10 standardmäßig aktiviert und (wurde zumindest) bei den großen Updates ungefragt reaktiviert). Ansonsten kann
A_TickCount alle 49,7 Tage überlaufen und zurück auf Null gehen. Wenn Du Pech hast, geschieht das genau während einer Protokollierung. Wenn die Schnellstartoption aktiv bleiben soll, sollte auf dem Rechner vor dem Start der Protokollierung ein echter Neustart ausgeführt werden.
Außerdem habe ich mir noch einmal alle Deine Informationen durchgelesen und mir auch die letzte eingestellte Fassung Deines Skript genauer angeschaut. Es mag besser sein, wenn Dein Skript so prorammiert ist, dass Du es nachvollziehen kannst. Dennoch habe ich erst einmal zwei Anmerkungen:
- Wenn Du Funktionen mit identischem Code mehrfach aufrufen willst, musst Du die nicht mehrfach mit unterschiedlichen Namen im Code ablegen. Du kannst deshalb ConvertToMilliseconds2() etc. wieder entfernen und die Aufrufe durch ConvertToMilliseconds() ersetzen. Außerdem ist es nicht üblich, die Funktionsdefinitionen mitten im aufrufenden Code unterzubringen.
- Die Berechnung der Start- und Endezeiten für die Untertitel-Dateien sieht z.Zt. so aus:
- Ersten Ausgabesatz ermitteln und Startzeit als "Versatz" speichern.
- Schleife
- Satz aus Log-Datei lesen und Start berechnen
Beim ersten Mal ist das der Satz, der schon für die Bestimmung des Starts der Ausgabe gelesen wurde.
Danach ist es der Satz, der schon für die Bestimmung des Endes der Anzeige gelesen wurde.
- Folgesatz aus Log-Datei lesen und Ende berechnen.
Die Sätze der Log-Datei werden dabei zweimal gelesen. Dabei wird aus der Zeitangabe des Log-Satzes zuerst das Ende des aktuellen Satzes und danach der Start des folgenden Satzes berechnet. Ende und Start sind also identisch und die Rechnerei für Start ist unnötig. Start kann einfach mit dem errechneten Ende des Vorsatzes gefüllt werden. Für den ersten Ausgabesatz, dessen Start ja immert
00:00:00,000 ist, kann der Endwert vor Beginn der Schleife mit diesem Wert vorbelegt werden.
Um zu zeigen, was ich meine, habe ich diesen Teil Deines Skripts überarbeitet. Ich hoffe, dass ich keine Fehler eingebaut habe, denn ich konnte es nicht testen:
Code: Select all
break_outer4:
Versatz := word_a1
; Eingefügt, das muss nur einmal berechnet werden
Versatz := ConvertToMilliseconds(Versatz)
ZeileLVT := 1
Nummer := 1
; Eingefügt, Grundstellung für Ende, wird als Startwert für die erste Zeile der Ausgabe genutzt
Ende := "00:00:00,000"
Loop
{
; Lvt-Satz lesen
FileReadLine, GanzeZeileLVT, UT-LVT.txt, %ZeileLVT%
StringSplit, word_arrayLVT, GanzeZeileLVT, `|, .
word_arrayLVT2 := SubStr(word_arrayLVT2, 1 , -1)
word_arrayLVT3 := SubStr(word_arrayLVT3, 1 , -1)
word_arrayLVT4 := SubStr(word_arrayLVT4, 1 , -1)
word_arrayLVT5 := SubStr(word_arrayLVT5, 1 , -1)
word_arrayLVT6 := SubStr(word_arrayLVT6, 1 , -1)
word_arrayLVT7 := SubStr(word_arrayLVT7, 1 , -1)
; Zeilennumer des nächsten Satzes der Lvt-Datei bestimmen
ZeileLVT += word_array2
; Start mit dem Ende des vorherigen Satzes versorgen
Start := Ende
; Zeilennummer der Log-Datei auf den nächsten Satz setzen
Zeile += 1
; Log-Satz lesen
FileReadLine, GanzeZeile, %SelectedFile%, %Zeile%
StringSplit, word_array, GanzeZeile, `;, .
; Fertig?
If word_array1 contains asdfjklö
{
Goto break_outer5
}
; Ende berechnen
Millisekunden := ConvertToMilliseconds(word_array1)
Differenz := Millisekunden - Versatz
Ende := ConvertToHHMMSSMS(Differenz)
; Fehlerprüfung übernommen, kann das wirklich sein???
If (Ende = "00:00:00,000")
{
Ende := Start
}
; Satz für erste Sprache ausgeben
FileAppend %Nummer%`n, Sprache1.srt
FileAppend, %Start% --> %Ende%, Sprache1.srt
FileAppend, `n%word_arrayLVT2%`n, Sprache1.srt
FileAppend, %word_arrayLVT3%`n, Sprache1.srt
FileAppend, %word_arrayLVT4%`n, Sprache1.srt
; Satz für zweite Sprache ausgeben
FileAppend %Nummer%`n, Sprache2.srt
FileAppend, %Start% --> %Ende%, Sprache2.srt
FileAppend, `n%word_arrayLVT5%`n, Sprache2.srt
FileAppend, %word_arrayLVT6%`n, Sprache2.srt
FileAppend, %word_arrayLVT7%`n, Sprache2.srt
; Nummer für Ausgabedateien erhöhen
Nummer += 1
}
break_outer5:
MsgBox, Fertig!
ExitApp
; Funktionen ans Ende geschoben
ConvertToMilliseconds(HHMMSSMS)
{
HH := SubStr(HHMMSSMS, 1, 2) * 1000 * 3600
MM := SubStr(HHMMSSMS, 4, 2) * 1000 * 60
SS := SubStr(HHMMSSMS, 7, 2) * 1000
MS := SubStr(HHMMSSMS, 10)
return HH + MM + SS + MS
}
ConvertToHHMMSSMS(Milliseconds)
{
HH := Milliseconds // 3600000
remain := Mod(Milliseconds, 3600000)
MM := remain // 60000
remain := Mod(remain, 60000)
SS := remain // 1000
remain := Mod(remain, 1000)
MS := Mod(remain, 1000)
return Format("{:02}:{:02}:{:02},{:03}", HH, MM, SS, MS)
}
Du kannst Dir das ja mal anschauen. Ich habe ein paar Kommentare eingefügt, um es verständlicher zu machen. Wenn Du es willst, können wie auch noch weitermachen. Wenn Du aber lieber bei Deinem Code bleiben willst, ist das natürlich auch in Ordnung.