News:

--

Main Menu

Projekt-Script Segment Informationen

Started by smart, October 19, 2025, 02:20:22 PM

Previous topic - Next topic

smart

Hallo, wieder ein Neuer :D
Ich nutze Avidemux seit vielen Jahren unter Linux. Und zwar zum Schneiden von TS-Dateien, die ich über Sat aufnehme. Dabei erstelle ich nur die Projekt-Script Dateien, die dann in aller Ruhe auf einem Server abgearbeitet werden. (Hinterher werden sie dann ebenfalls auf dem Server komprimiert - hat aber nichts mehr mit Avidemux zu tun).
So weit so gut.
Jetzt wollte ich mir die Arbeit teilweise vereinfachen, indem ich den bei manchen Filmen vorhandenen Rand auswerte (Python-Script mit CV2). Das gibt mir auch brav Übergänge von Werbung zu Film framegenau aus. Zumindest hoffe ich das.
Leider fehlt mir die Relation zwischen den ermittelten Framenummern und "adm.addSegment(0, 280440000, 20160000)" aus dem Projekt. Für die erste Zeile bekomme ich noch eine Beziehung hin. Danach nicht mehr. Kann wir jemand helfen?

Viele Grüße
Martin

eumagga0x2a

Hallo,

um die Zeit timeInRef im geladenen Quellvideo (nicht editiert, also nur ein einziges Segment) wie benötigt von addSegment(int refVideoNumber, double startTimeInRef, double segmentDuration) für das Bild mit Nummer frameNo zu ermitteln, kann man

adm = Avidemux()
ed = Editor()
adm.seekFrame(frameNo)
timeInRef = ed.getCurrentPts()
timeInRef += ed.getTimeOffsetForSegment(0)

verwenden. segmentDuration wäre dann PTS des ersten Bildes der Werbung minus PTS des ersten Bildes des "Payloads".

smart

#2
Hallo und Danke für die superschnelle Antwort.
Ich habe das jetzt so verstanden, dass ich mit den beiden Funktionen die Frame Zahl in den benötigten Wert umrechnen bzw. ermitteln kann.
adm = Avidemux()
if not adm.loadVideo("/home/smart/vid/record/TEST1.ts"):
    raise("Cannot load /home/smart/vid/record/TEST1.ts")
ed = Editor()
adm.clearSegments()


frame1 = 517
frame2 = 4155
adm.seekFrame(frame1)
timeInRef1 = ed.getCurrentPts()
timeInRef1 += ed.getTimeOffsetForSegment(0)
adm.seekFrame(frame2-frame1)
timeInRef2 = ed.getCurrentPts()
timeInRef2 += ed.getTimeOffsetForSegment(0)

adm.addSegment(0, timeInRef1, timeInRef2)
...

Leider bekomme ich nur Fehlermeldungen:
TinyPy:Exception

Exception: (_tp_dict_get) KeyError: adm
BackTrack:
File: py2bc.py, line 51
File: py2bc.py, line 10
File: parse.py, line 424
File: parse.py, line 414
File: parse.py, line 199
File: parse.py, line 80
File: parse.py, line 63
File: py2bc.py, line 51
File: py2bc.py, line 10
File: parse.py, line 424
File: parse.py, line 414
File: parse.py, line 199
File: parse.py, line 80
File: parse.py, line 63
File: , line 2

Was mache ich falsch?

eumagga0x2a

Nach adm.clearSegments() gibt es keine Segmente mehr, weswegen alle nachfolgenden Aufrufe fehlschlagen würden. Also, erst Zeitstempel zu allen Frames ermitteln, dann reinen Tisch machen. Die Fehlermeldung ist dennoch seltsam, eventuell wurde adm in Wirklichkeit noch vor der Zuweisung zu Avidemux() verwendet.

Übrigens, sind alle hier verwendeten Funktionen in den Ausgaben von

Avidemux.help()
Editor.help()

gelistet? Avidemux sollte ziemlich aktuell sein. Im Zweifel immer vom letzten verfügbaren offiziellen Nightly ausgehen (der letze Release 2.8.1 ist uralt).