Communitygithub.com

businessbaum/vedit – Final-Export

Dieses Skill wird verwendet, wenn der Benutzer die fertige Videodatei anfordert – z. B. „exportier das“, „render das fertig“, „mach das final“, „rende das Video“, „mach den Endexport“, „bau das Video zusammen“, „mach es fertig für YouTube“, „gib mir die MP4“. Es deckt das Rendern von Segmenten mit Cache, geschützte Concat, ein Durchlauf-Audio, Loudness-Normalisierung und das einmalige Muxen ab.

Was ist vedit – Final-Export?

Das Skill 'export-final' automatisiert den finalen Export eines Videoprojekts, indem es eine bewährte Render-Pipeline ausführt: Segment-Rendering mit Cache, geschütztes Concat, ein Durchlauf-Audio mit Loudness-Normalisierung und einmaligem Muxen. Es wird auf Benutzeraufforderungen wie „exportier das“ oder „gib mir die MP4“ ausgelöst und unterstützt sowohl automatische als auch slash-basierte Invokation. Das Skill stellt sicher, dass Filtergraphen immer in Dateien ausgelagert werden, um Windows-Kommandozeilenlimits zu vermeiden. Es umfasst Preflight-Prüfungen (QC), Segment-Rendering mit H.264/H.265 (standardmäßig NVENC), geschütztes Concat mittels `concat_compatible()`, zweifach durchgeführte Loudnorm auf Zielplattform (z. B. YouTube: I=-14, TP=-1.5, LRA=11) und einmaliges Muxen. Nach dem Export führt es sechs Pflichtprüfungen (z. B. Frames, Audio-Samples, Loudness, Container) durch und gibt einen detaillierten Bericht aus. Es wird auf Plattformen wie Claude Code, Cursor und Codex eingesetzt und basiert auf der `python engine/ve.py`-Pipeline.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/businessbaum/vedit/tree/HEAD/.agents/skills/export-final

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

export-final

Setze die fertige Datei zusammen. Argumente: $project Slug, $platform überschreibt output.platform, falls der Benutzer ein zweites Deliverable möchte. Vollständige Anfrage in $ARGUMENTS. Ein leerer $-Platzhalter bedeutet, dass das Skill automatisch ausgelöst wurde und nicht per Slash aufgerufen wurde – dann nimm das Projekt aus PIPELINE_STATE im Session-Kontext und gib an, welches du ausgewählt hast. Die Verb-Namen folgen dem Build-Vertrag; python engine/ve.py --help gewinnt.

Die Render-Architektur, die festgelegt ist

  • Video: eine gecachte MP4/MKV pro Segment, identische Encode-Parameter, jedes beginnend auf einem IDR-Frame, dann zusammengefügt mit -f concat -safe 0 -c copy. Verifiziert als verlustfrei und nahezu sofort.
  • Audio: ein kontinuierlicher Durchlauf über die gesamte Timeline in pcm_s24le. Niemals pro Segment gecacht.
  • Einmal muxen, AAC genau einmal encoden.

Entwirf dies zur Exportzeit nicht neu. Insbesondere: Vereinfache es nicht in einen einzigen filter_complex über alle Segmente: Ein Graph mit 150 Segmenten ist etwa 19.000 Zeichen lang und bei etwa 260 Segmenten läuft die Windows-Kommandozeile über, was einen nicht startbaren Prozess erzeugt, nicht etwa einen hilfreichen Fehler. Außerdem wird damit der Cache pro Segment weggeworfen, was der Grund ist, warum ein zweiter Export Sekunden dauert.

Filtergraphen gehen immer in eine Datei und werden als -/filter_complex fc.txt übergeben. Bedingungslos, nicht nur wenn sie lang werden.

Schritt 1 – Preflight

Vor dem Encode von irgendetwas:

  1. Führe QC durch. Ein Export über ein Projekt, das die QC nicht besteht, verschwendet den längsten Vorgang in der Pipeline.
  2. Bestätige output.platform. Sie bestimmt das Loudness-Ziel, die Auflösung und den Sicheren Bereich für Untertitel. Wenn $platform von output.platform abweicht, mutiere das Projekt nicht stillschweigend – rendere einen zweiten Ausgabepfad und gib an, welches welches ist.
  3. Berichte den Plan: Segmentanzahl, erwartete Gesamtframes, erwartete Dauer, Codec und ob in diesem Durchlauf Untertitel und Grafiken eingebrannt werden.

Schritt 2 – Segmente rendern

python engine/ve.py render $project

Gecacht pro Segment unter .cache/seg/, indexiert mit dem starken Schlüssel der Quelle, In/Out-Frames, Filtern, Encoder- und Tool-Versionen. Nur geänderte Segmente werden neu gerendert. --only seg_0012 rendert eines zur Inspektion.

Encoder-Standardeinstellungen: h264_nvenc, cq 20, preset p6. NVENC auf dieser Ada-Karte ist ungefähr auf VMAF- Parität mit libx264 – um 0,19 VMAF hinterher bei 2 Mbit/s, um 0,06 vorn bei 8 Mbit/s – und läuft dabei 2–4× schneller. Es ist die richtige Voreinstellung für Vorschauen und eine vertretbare für Finals. Wechsle zu libx264 nur, wenn der Benutzer maximale Qualität pro Bit wünscht und bereit ist zu warten.

Beide Encoder waren auf diesem Rechner Lauf-zu-Lauf byte-reproduzierbar, was den inhaltsadressierten Segment-Cache sicher macht.

Schritt 3 – Concat, aber zuerst absichern

concat_compatible() wird vor jedem -c copy Concat ausgeführt, ohne Ausnahme. Bei einer Parameter-Abweichung liefert der Concat-Demuxer eine korrupte Datei mit exit 0 – keine Warnung, kein Fehler, eine Datei, die zehn Sekunden läuft und dann auseinanderfällt. QC-Prüfung (c) ist genau diese Prüfung.

Sie vergleicht Auflösung, Pixelformat, Codec, Profil, Level, Zeitbasis, Abtastrate und Kanallayout über alle Segmente hinweg. Eine Abweichung bedeutet, dass ein Segment mit anderen Parametern gerendert wurde – meist ein alter Cache-Eintrag aus der Zeit vor einer Änderung der Encoder-Einstellungen. Rendere die betreffenden Segmente neu, anstatt den Concat zu erzwingen.

Schritt 4 – Audio und Loudness

python engine/ve.py render $project

Danach zwei Durchgänge loudnorm auf das Plattform-Ziel aus output.loudnorm (YouTube: I –14, TP –1,5, LRA 11; andere Plattformen unterscheiden sich und stehen in presets/formats/).

Durchgang 2 muss ein explizites -ar 48000 mitführen. Ohne dies ist der Ausgang stillschweigend 192 kHz – loudnorms interne Rate sickert in den Ausgang, die Datei ist viermal größer als erwartet, und manche Player resamplen sie schlecht. Dies ist das am häufigsten übersehene Flag in der gesamten Kette.

Zwei Durchgänge, nicht einer: Loudnorm mit einem Durchgang ist eine dynamische Schätzung und liegt ein Dezibel oder mehr vom Ziel entfernt bei Material mit einem leisen Einstieg – was jedes Talking-Head-Video mit einem Hintergrund ist.

Schritt 5 – Einmal muxen

Die Schritte 2 bis 5 sind alle ve render $project: es rendert die gecachten Segmente oder nutzt sie wieder, fügt sie zusammen, rendert das Audio in einem Durchlauf, wendet Loudnorm an und muxt AAC 320k genau einmal in projects/$project/out/final.mp4 gemäß output.path.

Code das Video beim Mux nicht neu. Wenn sich am Bild etwas ändern muss, ändert es sich auf der Segment-Ebene und der Cache erledigt den Rest.

Nach dem Muxen setzt ve render die gerenderten Overlays zusammen und brennt dann die ASS ein, falls captions.burn_in gesetzt ist – in dieser Reihenfolge, damit Untertitel über Grafiken liegen. Beide encodieren das Master neu, weshalb ve gfx und ve captions Dinge sind, die du vor ve render ausführst, nicht nachher. Wenn du sie nachher ausführst, bleibt das Master eine Version zurück und nichts warnt dich.

ve export ist ein separater, späterer Schritt: es führt eine vollständige QC durch, verweigert bei Fehlern, sofern du nicht --force übergibst, stempelt dann eine datierte Auslieferungskopie und schreibt eine .manifest.json daneben.

Schritt 6 – Überprüfen des Deliverables, dann übergeben

Führe die obligatorischen Prüfungen an der tatsächlichen Ausgabedatei durch, nicht am Plan:

  • Frame-Anzahl entspricht der Summe von (out_frame - in_frame) über aktivierte Segmente. QC (a).
  • Audio-Sample-Anzahl entspricht frames / fps * 48000. QC (b).
  • ebur128 Integrated Loudness innerhalb von 0,5 LU des Plattform-Ziels, True Peak unterhalb der Obergrenze. QC (f).
  • Container, Auflösung, Bildrate und Dauer stimmen mit output überein.
  • Stichprobenartig drei Frames prüfen: erster, eine Segmentgrenze in der Mitte, letzter. Ein schwarzer Frame an einer Grenze bedeutet, dass ein Segment zu kurz gerendert wurde.

Dann berichten: Ausgabepfad, Dateigröße, Dauer, gemessene LUFS und True Peak, Frame-Anzahl, Segment-Anzahl und wie viele Segmente aus dem Cache kamen. Setze stage auf "export".

Zweite Deliverables

Ein vertikaler Schnitt ist kein erneuter Zuschnitt der fertigen Datei. Er ist eine andere output.platform, was ein anderes Loudness-Ziel, eine andere Untertitel-Voreinstellung und einen anderen sicheren Bereich bedeutet, und meist einen anderen Story-Durchlauf. Sage das, anstatt das 16:9-Master zu skalieren.

Fehlermodi

SymptomUrsacheBehebung
Ausgabe läuft, bricht dann ab, ffmpeg beendet mit 0Parameterkonflikt beim Concatconcat_compatible() vor jedem Concat; betreffende Segmente neu rendern
Master ist 192 kHzLoudnorm-Durchgang 2 fehlt -ar 48000Hinzufügen und Durchgang 2 wiederholen
Encode-Prozess startet nichtFiltergraph in der KommandozeileImmer fc.txt schreiben und -/filter_complex übergeben
Loudness ein Dezibel vom Ziel entferntEin-Durchgang-LoudnormZwei Durchgänge
Export wird jedes Mal langsamerCache durch geänderte Encoder-Einstellung ungültigErwartet; bestätige, dass die Änderung beabsichtigt war
Schwarzer Frame an einem SchnittSegment zu kurz gerendertDieses Segment neu rendern; QC (a) prüfen
Stimme leiser im Finale als in der Vorschauamix fehlt normalize=0Im Audio-Graph korrigieren, Audio neu rendern

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

businessbaum/vedit

This skill should be used when the user asks for subtitles or on-screen text of what is being said - "brenn die Untertitel ein", "mach Untertitel", "Untertitel drauf", "leg Untertitel drüber", "brenn die Subs ein", "mach die Captions", "Wort für Wort Untertitel", "Karaoke-Untertitel", "korrigier den Untertitel-Text", "burn in the captions", "add subtitles", "burn the subs", "word-by-word captions", "fix a caption typo". Covers ASS generation, the pixel-width grouping rule for German, the font table, and burn-in through libass.

businessbaum/vedit

This skill should be used when the user asks for mechanical tightening of material that is already selected - "mach den Rohschnitt", "bau den Rohschnitt", "schneid die Ähms raus", "nimm die Füllwörter raus", "entferne die Pausen", "kürz die Pausen", "schneid die Versprecher raus", "mach den Radioschnitt", "straff das", "build the rough cut", "cut the fillers", "remove the ums", "tighten the pauses", "trim the dead air", "cut the retakes", "radio edit". Turns kept story blocks into enabled segments in project.json. Does not decide what the video is about - that is cut-story.

businessbaum/vedit

This skill should be used when the user asks to decide what the video is actually about before any mechanical cutting - "bau die Story", "was soll ins Video", "was kann raus", "welche Themen bleiben", "kürz das auf 6 Minuten", "mach daraus ein kurzes Video", "wo ist der Hook", "sortier die Themen", "worum geht es hier eigentlich", "build the story", "decide what stays", "structure this", "cut this down to N minutes", "find the hook", "reorder the topics". This is the CONTENT-selection pass that writes the "story" block in project.json; it runs after transcribe and before cut-rough.

Verwandte Skills