Avidemux Forum

Non-English => Avidemux-German => Topic started by: ted on September 03, 2019, 04:31:14 AM

Title: Wie arbeitet adm.addSegment ?
Post by: ted on September 03, 2019, 04:31:14 AM
Hallo,

ich möchte Avidemux zum Schneiden verwenden, aber die Schnittliste konvertieren und für ein anderes Videoprogramm als Projetkdatei verwenden.

Für die Konvertierung muss ich natürlich auch die adm.addSegment-Anweisungen übersetzen. Bis jetzt habe ich folgendes herausgefunden:
adm.addSegment(a, b, c)
a = ?
b = Start-Frame in Millisekunden*1000
c = Dauer des Segments in Millisekunden*1000

Das erste Frame eines Videos ist bei Avidemux immer ungleich 0, beim anderen Programm ist es immer 0. Also muss ich diesen Offset bei allen Millisekunden von Avidemux abziehen. Das andere Programm hat den Faktor 10000 statt 1000. Das ergibt folgende Rechnung, zB:
adm.addSegment(0, 457464000, 34750000)
Start = (457464000 - Frame1) *10
Ende = (457464000 - Frame1 + 34750000) *10

Soweit stimmt alles mit dem anderen Programm überein, getestet.

Nur beim allerletzten(!) Segment habe ich ein Problem.
Auf einmal ist die Anzahl der Frames des Segments nicht mehr ein Vielfaches von 1000,
zB: adm.addSegment(0, 512381000, 28145833)
Wegen den 833 komme ich zu einem anderen Segmentende, als das andere Programm hat. Die 512381000 sind ok.

Hat jemand für mich eine Erklärung, warum gerade das letzte Segment nicht mit 000 endet ?
Und was ist der erste Parameter in adm.addSegment ?

Oder kann ich das irgendwo nachlesen ?
Title: Re: Wie arbeitet adm.addSegment ?
Post by: eumagga0x2a on September 03, 2019, 06:19:55 AM
Quote from: ted on September 03, 2019, 04:31:14 AM
ich möchte Avidemux zum Schneiden verwenden, aber die Schnittliste konvertieren und für ein anderes Videoprogramm als Projetkdatei verwenden.

Heikel, je nachdem was das Programm sehen möchte und wie fehlertolerant es ist.

QuoteFür die Konvertierung muss ich natürlich auch die adm.addSegment-Anweisungen übersetzen. Bis jetzt habe ich folgendes herausgefunden:
adm.addSegment(a, b, c)
a = ?

Das erste Argument ist die Nummer des Videos von Null gezählt, d. h. wenn in Avidemux ein Video angefügt ist, ist "a" beim Hinzufügen seiner Segmente gleich 1. Beim allerersten Video ist es 0.

Quoteb = Start-Frame in Millisekunden*1000

Das nennt sich Mikrosekunden (µs oder vielfach "us", um bei ASCII zu bleiben), die Anzahl muss nicht ein Vielfaches von 1000 sein.

QuoteDas erste Frame eines Videos ist bei Avidemux immer ungleich 0

Nicht immer, aber immer dann, wenn B-Frames im Spiel sind oder Audio vorgezogen werden muss, weil Avidemux benutzt uint64_t als Format für Zeitstempel.

Quotebeim anderen Programm ist es immer 0.

Hätte man im Avidemux haben können, wenn int64_t für Zeitstempel verwendet worden wäre, um negative Werte abbilden zu können. Das jetzt zu ändern würde aber massive Umbauten nach sich ziehen.

QuoteAlso muss ich diesen Offset bei allen Millisekunden von Avidemux abziehen. Das andere Programm hat den Faktor 10000 statt 1000. Das ergibt folgende Rechnung, zB:
adm.addSegment(0, 457464000, 34750000)
Start = (457464000 - Frame1) *10
Ende = (457464000 - Frame1 + 34750000) *10

Soweit stimmt alles mit dem anderen Programm überein, getestet.

Wie gesagt, entweder ist das andere Programm wunderbar fehlertolerant oder eben das Video erfüllt zufälligerweise die gemachten unzutreffenden Annahmen.

QuoteNur beim allerletzten(!) Segment habe ich ein Problem.
Auf einmal ist die Anzahl der Frames des Segments nicht mehr ein Vielfaches von 1000,

Mikrosekunden, nicht Frames...

QuotezB: adm.addSegment(0, 512381000, 28145833)
Wegen den 833 komme ich zu einem anderen Segmentende, als das andere Programm hat. Die 512381000 sind ok.

Hat jemand für mich eine Erklärung, warum gerade das letzte Segment nicht mit 000 endet ?

Weil es nicht ein Vielfaches von 1000 sein muss? (Okay, in MKV im Prinzip schon, aber der Editor in Avidemux arbeitet auf einer anderen Abstraktionsebene.)

Es geht auch darum, wie man die Anzeigedauer des letzten Frames setzt, besonders wenn das Video für Synchronisation mit dem Ton verschoben werden muss, es sind viele Faktoren am Werk. Zugegeben, einige meiner Änderungen wie das hier (https://github.com/mean00/avidemux2/blob/master/avidemux/common/ADM_editor/src/ADM_segment.cpp#L684) bedürfen einer anderen Lösung.
Title: Re: Wie arbeitet adm.addSegment ?
Post by: Seg030 on October 24, 2019, 02:00:44 PM
Hallo,

Kann man den Mikrosekunden-Wert (gemein sind nur die 3 Stellen) in avidemux ablesen oder aus Werten berechnen/ableiten?

Hintergrund: Ich möchte ein und das selbe script file für mehrere videos verwenden. Die Schnittmarken werden von mir berechnet und im Script hinterlegt. Aus den Schnittmarken kann man sich den Wert auf Millisekunden genau berechnen, jedoch finde ich keinen Hinweis auf die Mikrosekunden-Stellen außer wenn ich ein Projekt-Script abspeichere und von dort auslese.

Lg, Seg
Title: Re: Wie arbeitet adm.addSegment ?
Post by: eumagga0x2a on October 26, 2019, 11:45:06 AM
pts = Editor().getPts(frameNo)

pts enthält nun den genauen PTS-Wert für Frame Nr. frameNo in der Stream-Reihenfolge.
Title: Re: Wie arbeitet adm.addSegment ?
Post by: Seg030 on October 26, 2019, 07:38:03 PM
Danke