Aufgezeichnetes Video bearbeiten
Rezepte für Beiträge, die auf aufgezeichnetem Filmmaterial basieren. Sie werden in die Schleife von montagent im Erstellungsschritt eingefügt; laden Sie zuerst montagent, falls Sie dies noch nicht getan haben. Für einen Sprecher, einen Präsentator-Clip oder einen Interview-Schnitt öffnen Sie die Sprecherstruktur, bevor Sie planen.
Vom Filmmaterial ausgehen
Bevor Sie ein Element schreiben, proben Sie jeden Clip: seine Größe, Bildrate, Länge und ob er Ton hat. Dann planen Sie den Beitrag auf der Grundlage der Sprachspur. Die Wortzeitsteuerungen sind der Takt, an dem jeder Untertitel, jedes Stichwort und jedes Ducking hängt, daher werden die Zeitsteuerungen zuerst überprüft (siehe Untertitel).
Um einen Moment aus einem langen Clip auszuwählen (z. B. den Abschnitt einer Bildschirmaufnahme, der in einem Insert gezeigt werden soll), legen Sie den Clip allein in ein Scratch-Projekt und rufen Sie frame --from 0 --to <seine Länge> --infill-ceiling <ms> auf, wobei die Obergrenze bei einem Zwanzigstel der Länge liegt. Ein Aufruf ergibt ein beschriftetes Kachelbild alle paar Sekunden; frame --at für jede Kachel, die Sie näher betrachten möchten.
Rezepte
Jedes Rezept gibt Ausgangsbereiche vor, keine endgültigen Antworten. Jedes endet mit einem Prüfschritt: Laden Sie montagent-craft, dann schauen Sie dort hin, wo der Schritt angibt, bevor Sie fortfahren.
Filmmaterial platzieren
{
"frame": {"width": 1080, "height": 1920}, "fps": 30, "background": "#FF5A36", "duration": 6000, "output": "out/presenter.mp4",
"tracks": [
{"name": "presenter", "layer": 10, "elements": [
{"id": "presenter", "type": "video", "start": 0, "end": 6000, "source": "media/clip.mp4", "source_start": 0, "source_end": 6000, "x": 540, "y": 2160, "origin": "bottom-center", "width": 3413, "height": 1920, "fit": "cover", "effects": [{"name": "chroma", "color": "#00FF00", "tolerance": 0.2, "softness": 0.08, "spill": 0.9}]}
]}
]
}
- Breites Filmmaterial in einem hohen Rahmen: Machen Sie das Element so hoch wie den Rahmen und so breit, wie es das Seitenverhältnis der Quelle vorgibt (1920 Höhe ergibt 3413 Breite bei 16:9), und schieben Sie es dann seitlich, um den Sprecher zentriert zu halten.
- Augen: 25–35 % des Weges von oben im Rahmen. Senken Sie den unteren Mittelpunkt des Elements unter die Unterkante des Rahmens, um dies zu erreichen; das Abschneiden der Beine ist normal.
- Kopfraum: 4–8 % der Rahmenhöhe über dem Haar.
- Ein kürzerer Take als der Beitrag:
"overrun": "hold"friert sein letztes Bild ein. Halten Sie das eingefrorene Bild unter einer halben Sekunde, oder beenden Sie den Beitrag früher. - Ein Standbild innerhalb eines Clips, eine Zeitlupe oder eine Rückwärtswiedergabe: Schreiben Sie
source_timeanstelle vonsource_startundsource_end: ein Literal friert einen Moment ein, und Schlüssel von Quell-Millisekunden gegen die Zeitachsetrampen (ein flaches Paar friert ein, ein fallendes Paar kehrt um). Setzen Sie"frame_blend": "mix"bei einem Zeitlupenclip (speed< 1.0) oder einem Clip mit Geschwindigkeitsrampe (source_time), um aufeinanderfolgende Quellbilder überblenden zu lassen, anstatt zwischen den nächsten Bildern zu springen ("none"). Für einen Posterize-Time-Effekt (Stop-Motion) auf Filmmaterial verwenden Sie gestuftesource_time-Keyframes, die jeden Ziel-Quell-Zeitstempel über mehrere Zeitachsen-Bilder hinweg halten. Ein Clip mitsource_timeist beivolume0 stumm, also legen Sie seinen Ton auf ein eigenesaudio-Element. - Der eigene Ton des Takes: Die Sprachspur bleibt bei
volume1.0. Alles andere wird darunter gemischt. - Prüfen:
frameam Anfang, in der Mitte und beim letzten gezeichneten Bild, und überprüfen Sie, ob die Augen im Band liegen und nichts Wichtiges an den Seiten des Rahmens abgeschnitten wird.
Greenscreen-Keying
chroma auf dem Filmmaterial-Element keyt den Hintergrund aus. Starten Sie hier:
color: Die reine Farbe des Hintergrunds,#00FF00für einen Greenscreen. Ein beleuchteter Hintergrund, der etwas in Richtung Blau oder Gelb abgedriftet ist, wird bei diesen Toleranzen ebenfalls ausgekeyt, sodass Sie ihn nicht abtasten müssen.tolerance: 0.2 (Bereich 0.18–0.25). Über etwa 0.3 frisst der Key schwarze Haare, weiße Kragen und dunkle Kleidung.softness: 0.08 (Bereich 0.05–0.1).spill: 0.9 (Bereich 0.9–1.0).
Überprüfen Sie es, bevor irgendetwas anderes darüber gelegt wird:
- Drei verlustfreie Ausschnitte.
frame --crop <x,y,w,h> --pngan den Haaren, an einer Schulter- oder Ärmelkante und an den Händen, über dem Hintergrund, auf dem Sie ausliefern werden. Ein Ausschnitt wird im wahren Maßstab zurückgegeben, daher reicht ein 200–400 px großes Kästchen. - Schon fertig? Haare, Kragen und Hände sind deckend, mit höchstens einer 1–2 px dunklen, olivfarbenen oder braunen Linie entlang der Kanten: Der Key ist fertig, fahren Sie fort. Diese Linie ist der Kantenboden: Jede Einstellung von 0,12 bis 0,3 hinterlässt sie, und
spillhat sie bereits von Grün auf Braun umgestellt, sodass ein grüner Pixelzähler darauf Null anzeigt. - Andernfalls eine Korrektur pro Fehler. Der Hintergrund scheint durch Haare, einen Kragen oder dunkle Kleidung: Senken Sie
toleranceum 0.05. Ein blasser oder grüner Lichthof, der breiter als der Kantenboden ist: Erhöhen Sietoleranceum 0,03 odersoftnessum 0,03. Erstellen Sie erneut einen Ausschnitt und gehen Sie zurück zu Schritt 2. Maximal drei Einstellungen, alle an dem einen gekeyten Element: Gekeyte Kopien, die nach Region aufgeteilt sind, vervielfachen die Renderzeit und hinterlassen dennoch eine Naht. - Drift.
measuren Sie das gekeyte Element. Sein deckender Anteil sollte über den gesamten Take hinweg innerhalb von ein bis zwei Punkten bleiben. Ein Sprung bedeutet, dass sich die Beleuchtung dort geändert hat: Keyen Sietolerancemit einem Keyframe auf jeder Seite des Sprungs, oder schneiden Sie das Element an diesem Frame und keyen Sie jeden Teil separat.
- Prüfen:
framedes gesamten Bildes zu zwei Zeitpunkten, an denen sich der Sprecher am meisten bewegt, und überprüfen Sie, ob die Kontur hält.
Untertitel mit hervorgehobenem gesprochenem Wort
Untertitel stammen aus den bereitgestellten Wortzeitsteuerungen, über das gebündelte Skript, nicht von Hand. python3 scripts/captions.py <Projekt> <Wörter> <Spezifikation> (führen Sie es mit --help für die Spezifikation aus) überprüft die Zeitsteuerungen, bricht die Wörter mit measure in Seiten zu ein oder zwei Zeilen auf, gibt jedem Wort ein highlight-Fenster, während es gesprochen wird, und gibt das Projekt mit den hinzugefügten Untertiteln aus. Es meldet jede Korrektur auf stderr. Lesen Sie diesen Bericht: Er ist die Zeitsteuerungsprüfung.
- Was es prüft: Ein Wort, das eine Phrase beginnt, nachdem die Sprache bereits wieder eingesetzt hat (ein geliefertes „Now“ mit 110 ms Verspätung und 20 ms Länge ist der klassische Fall), ein Wort, das in einer Stille sitzt, sich überschneidende Wörter und Wörter, die zu kurz zum Sehen sind. Kurze Wörter werden auf
min_word(150 ms) verlängert: in die Pause danach, dann vom nächsten Wort. Ein gemeldetes Wort in einer Stille bedeutet, dass die Datei dort nicht ausgerichtet ist: Korrigieren Sie die Datei und führen Sie sie dann erneut aus. - Größe: 56–72 px auf einem 1080 breiten Rahmen, fett, eine helle Farbe für die Zeile und der Akzent der Marke für das gesprochene Wort.
- Zeilen: maximal zwei,
widthetwa 80 % der Rahmenbreite. Eine Seite bricht an einem Satzende oder einer Pause von 400 ms oder mehr um. - Hintergrund: Eine
pillin der dunkelsten Markenfarbe bei 80–85 % Alpha (CC–D9) ist über jedem Filmmaterial lesbar.pad28–36 px quer und 14–20 px nach unten,radius20–28. - Platzierung: Unterhalb des Kinns und frei von den unteren 15–20 % eines hohen Rahmens, wo Player ihre Bedienelemente zeichnen. Bei 1080×1920 liegt die Mitte bei etwa
y1350–1450. Bei einem breiten Rahmen zentrieren Sie es 10–14 % über dem unteren Rand. - Seiten bleiben sichtbar, bis die nächste Seite beginnt, oder 1 s nach dem letzten Wort, wenn eine längere Pause folgt.
Es schreibt echte Untertitel, also handeln Sie basierend auf den Untertitelfunden, die validate dazu ausgibt.
- Prüfen:
frame --from --toüber eine Seite: Jedes beleuchtete Wort ist eine eigene Kachel. Überprüfen Sie, dass jede Kachel genau ein Wort in der Sprechreihenfolge beleuchtet und dass das Kästchen frei vom Gesicht bleibt. Dannframe --atdes ersten Frames nach der längsten Pause und überprüfen Sie, dass die neue Seite angezeigt wird und nichts vorzeitig beleuchtet ist.
Namensbauchbinde über Filmmaterial
Eine untere Drittel-Einblendung wischt ein- und aus. Filmmaterial ist keine gleichmäßige Farbe, daher kann der Verdeckungs-Wipe aus montagent-motion die Leiste selbst nicht aufdecken. Stattdessen wächst die Leiste von ihrer Kante aus, und ihr Text wird durch einen Verdeckungs-Wipe in der eigenen Farbe der Leiste, die einfarbig ist, aufgedeckt.
{
"frame": {"width": 1080, "height": 1920}, "fps": 30, "background": "#6E7B8B", "duration": 7000, "output": "out/namebar.mp4",
"fonts": {"bold": [{"file": "fonts/Inter-Bold.ttf"}]},
"fontVendor": {"fonts/Inter-Bold.ttf": {"licence": "OFL-1.1", "source": "https://github.com/rsms/inter", "sha256": "288316099b1e0a47a4716d159098005eef7c0066921f34e3200393dbdb01947f"}},
"tracks": [
{"name": "bar", "layer": 20, "elements": [
{"id": "bar", "type": "rect", "start": 1000, "end": 6534, "x": 64, "y": 1160, "origin": "center-left", "width": 760, "height": 160, "fill": "#101418", "radius": 8, "scale": [{"t": 1000, "v": [0.0, 1.0]}, {"t": 1300, "v": [1.0, 1.0], "ease": [0.65, 0, 0.35, 1]}, {"t": 6266, "v": [1.0, 1.0], "ease": "linear"}, {"t": 6533, "v": [0.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]}
]},
{"name": "bar-edge", "layer": 21, "elements": [
{"id": "bar-edge", "type": "rect", "start": 1000, "end": 6534, "x": 64, "y": 1160, "origin": "center-left", "width": 12, "height": 160, "fill": "#FF5A36"}
]},
{"name": "bar-name", "layer": 22, "elements": [
{"id": "bar-name", "type": "text", "start": 1300, "end": 6266, "x": 108, "y": 1128, "origin": "center-left", "width": 400, "height": 70, "font": "bold", "size": 58, "color": "#F5F0E6", "runs": [{"text": "Montagent"}], "caption": false}
]},
{"name": "bar-line", "layer": 22, "elements": [
{"id": "bar-line", "type": "text", "start": 1300, "end": 6266, "x": 108, "y": 1196, "origin": "center-left", "width": 560, "height": 44, "font": "bold", "size": 34, "color": "#F5F0E6", "runs": [{"text": "Video your agent can read"}], "caption": false}
]},
{"name": "bar-cover", "layer": 23, "elements": [
{"id": "bar-cover-on", "type": "rect", "start": 1300, "end": 1700, "x": 800, "y": 1160, "origin": "center-right", "width": 716, "height": 140, "fill": "#101418", "scale": [{"t": 1300, "v": [1.0, 1.0]}, {"t": 1666, "v": [0.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]},
{"id": "bar-cover-off", "type": "rect", "start": 6000, "end": 6266, "x": 84, "y": 1160, "origin": "center-left", "width": 716, "height": 140, "fill": "#101418", "scale": [{"t": 6000, "v": [0.0, 1.0]}, {"t": 6233, "v": [1.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]}
]}
]
}
- Ein: Die Leiste wächst von ihrer linken Kante aus über 250–350 ms,
[0.65, 0, 0.35, 1]. Der Text und seine Abdeckung beginnen in dem Frame, in dem die Leiste vollständig gewachsen ist (niemals früher, sonst zeigt sich die Abdeckung über dem Filmmaterial). Die Abdeckung schrumpft über ihre entfernte Kante über 300–400 ms und legt den Text in Lesereihenfolge frei. - Aus, beginnend mit seinem Stichwort: Die Abdeckung wächst in 200–300 ms über den Text zurück, dann schrumpft die Leiste in 250–300 ms auf ihre Kante zurück. Die gesamte Leiste ist 450–600 ms nach dem Stichwort verschwunden.
- Größe: Leiste 130–180 px hoch auf einem 1080 breiten Rahmen, Name 52–64 px, zweite Zeile 30–38 px. Ein Akzentstreifen von 8–16 px Breite an der Vorderkante.
- Abdeckung: Genau die
fill-Farbe der Leiste, 20 px innerhalb der Leistenenden und 10 px innerhalb ihrer Ober- und Unterkante, über dem Text. - Platzierung: 48–80 px vom Rahmenrand entfernt, frei von der Untertitelbox und dem Gesicht des Sprechers, normalerweise bei 55–65 % der Höhe eines hohen Rahmens.
- Prüfen:
frame --from --to --keyframesüber 1 s ab jedem Stichwort und überprüfen Sie, dass auf keiner Kachel eine Abdeckung über die Leiste hinausragt.frame --atder Leiste in Ruheposition und überprüfen Sie, ob ihre linke Kante mit dem Rand der Untertitelbox übereinstimmt.
Rundes Bild-im-Bild
Zeigen Sie einen zweiten Clip in einem Kreis: ein Video-Element mit einer Kreis-mask, einem Ring dahinter und einem Pop auf der Überschwingungs-Bezierkurve.
{
"frame": {"width": 1080, "height": 1920}, "fps": 30, "background": "#6E7B8B", "duration": 6000, "output": "out/pip.mp4",
"tracks": [
{"name": "pip-ring", "layer": 30, "elements": [
{"id": "pip-ring", "type": "ellipse", "start": 1000, "end": 5500, "x": 800, "y": 900, "origin": "center", "width": 384, "height": 384, "fill": "#F5F0E6", "scale": [{"t": 1000, "v": [0.0, 0.0]}, {"t": 1400, "v": [1.0, 1.0], "ease": [0.34, 1.56, 0.64, 1]}, {"t": 5233, "v": [1.0, 1.0], "ease": "linear"}, {"t": 5466, "v": [0.0, 0.0], "ease": "ease-in"}], "effects": [{"name": "shadow", "dx": 0, "dy": 16, "radius": 40, "color": "#101418", "opacity": 0.35}]}
]},
{"name": "pip", "layer": 31, "elements": [
{"id": "pip", "type": "video", "start": 1000, "end": 5500, "source": "media/clip.mp4", "source_start": 10000, "source_end": 14500, "volume": 0, "x": 800, "y": 900, "origin": "center", "width": 640, "height": 360, "fit": "contain", "scale": [{"t": 1000, "v": [0.0, 0.0]}, {"t": 1400, "v": [1.0, 1.0], "ease": [0.34, 1.56, 0.64, 1]}, {"t": 5233, "v": [1.0, 1.0], "ease": "linear"}, {"t": 5466, "v": [0.0, 0.0], "ease": "ease-in"}], "effects": [{"name": "mask", "shape": "circle", "x": 140, "y": 0, "width": 360, "height": 360}]}
]}
]
}
- Das Rechteck des Kreises: Ein Quadrat, das so hoch ist wie das Element. Seine
xwählt aus, welcher Teil des Bildes angezeigt wird. Die Mitte ist(width - height) / 2, und das ist die zu verwendende: Der Pop skaliert um denorigindes Elements, sodass ein von der Mitte weg bewegter Kreis beim Wachsen seitlich driftet. Um einen anderen Teil des Bildes anzuzeigen, wählen Sie einensource_start, bei dem dieser Teil in der Mitte sitzt, oder machen Sie das Element größer und setzen Sie seinexso, dass der Teil im Kreis landet, und keyen Sie dannxauf der Pop-Kurve, damit die Kreismitte stillsteht. - Größe: 30–40 % der Rahmenbreite. Der Ring ist 12–24 px breiter als der Kreis, in der hellsten Farbe des Hintergrunds, mit einem weichen
shadow. - Pop: 350–450 ms auf
[0.34, 1.56, 0.64, 1]für beide, von Skalierung 0, auf denselben Keys. Ausgang in 200–300 ms,ease-in, zurück auf 0. - Timing: Ein, wenn der Sprecher zum ersten Mal das Ding nennt, das es zeigt, aus einen Schlag vor dem Ende, damit der Abschluss sauber ist.
- Platzierung: Neben dem Sprecher auf Brusthöhe, frei von Gesicht und Untertitelbox und 40 px oder mehr vom Rahmenrand entfernt.
- Ton:
volume0, es sei denn, der eigene Ton des Clips ist der Punkt. - Prüfen:
frameam Höhepunkt des Pops (Start plus 40 % seiner Länge) und überprüfen Sie, ob der Kreis das Gesicht und den Rahmenrand freilässt.framein Ruheposition und überprüfen Sie, ob der relevante Teil innerhalb des Kreises liegt.
Musik unter einer Sprachspur
Die Musik duckt sich, während die Sprachspur spricht, und kommt in den Pausen wieder hoch. scripts/duck.py schreibt dies als gewöhnliche volume-Keyframes auf das Musikelement, basierend auf den Wortzeitsteuerungen der Sprachspur (--words, einer JSON-Datei), der Musik (--music, einem Pfad) und dem Ausgabeprojekt (-o).
python3 scripts/duck.py --words mytimings.json --music media/track.mp3 -o project_with_duck.json # duckt eine einzelne Datei
python3 scripts/duck.py --words mytimings.json -o project_with_duck.json # duckt das `music`-track-Element im Projekt
Vor dem Ducken: Die Musik in einer DAW vorbereiten. Schneiden Sie die Länge auf den Beitrag zu, passen Sie die Lautstärke des lautesten Abschnitts auf etwa -18 LUFS an (oder leiser für Umgebungsmusik), und normalisieren Sie die Lautstärke auf einen Spitzenwert von -3 dBFS. Exportieren Sie als 44.1 kHz 16-Bit Stereo-WAV.
- Rückgang: 22–28 dB unter dem Ruhepegel.
threshold(Standard -30 dBFS) startet den Rückgang 70–110 ms vor dem Wort.attack20–40 ms senkt die Lautstärke auf das Verhältnis vonfloor,hold40–80 ms hält sie dort, undrelease300–500 ms hebt sie wieder an. Engerereleases klingen pumpend; weitere klingen natürlich. - Ruhepegel: 75–85 % des DAW-Niveaus, damit die Musik hörbar, aber nicht aufdringlich ist.
- Ducking im Takt: Ducken Sie auf der Eins des Schlags vor dem ersten Wort:
--beatsetzt den Rückgang des Duckers auf das nächste Vielfache vonbeatms vor dem Wort.beatist das Schlagintervall in ms. - Gruppiertes Ducking für denselben Sprecher: Der
namedes Duckers gruppiert Ducking-Keyframes, sodass ein Ducken in einer Pause zwischen zwei Phrasen desselben Sprechers ein einzelnes Anheben auslöst. Dernamedes Duckers ist der Name der Sprachspur. - Das Timing lesen: Der Ducking-Bericht zeigt jedes Ducking-Ereignis, sodass Sie die Bewegung der Lautstärke in
frame-Kacheln überprüfen können. - Prüfen:
frame --atauf dem ersten Frame der Sprachspur, auf dem Höhepunkt des Duckings und auf dem ersten Frame ohne Sprachspur danach. Die Lautstärke sollte dort sein, wo der Bericht sie vorhersagt.
Vollständiges Projektbeispiel
{
"frame": {"width": 1080, "height": 1920}, "fps": 30, "background": "#6E7B8B", "duration": 10000, "output": "out/final.mp4",
"fonts": {"bold": [{"file": "fonts/Inter-Bold.ttf"}]},
"fontVendor": {"fonts/Inter-Bold.ttf": {"licence": "OFL-1.1", "source": "https://github.com/rsms/inter", "sha256": "288316099b1e0a47a4716d159098005eef7c0066921f34e3200393dbdb01947f"}},
"tracks": [
{"name": "background", "layer": 1, "elements": [
{"id": "bg-video", "type": "video", "start": 0, "end": 10000, "source": "media/background.mp4", "source_start": 0, "source_end": 10000, "x": 540, "y": 960, "origin": "center", "width": 1080, "height": 1920, "fit": "cover", "volume": 1.0}
]},
{"name": "presenter", "layer": 10, "elements": [
{"id": "presenter", "type": "video", "start": 0, "end": 10000, "source": "media/presenter.mp4", "source_start": 0, "source_end": 10000, "x": 540, "y": 2160, "origin": "bottom-center", "width": 3413, "height": 1920, "fit": "cover", "volume": 1.0, "effects": [{"name": "chroma", "color": "#00FF00", "tolerance": 0.2, "softness": 0.08, "spill": 0.9}]}
]},
{"name": "music", "layer": 2, "elements": [
{"id": "music", "type": "audio", "start": 0, "end": 10000, "source": "media/music.mp3", "volume": 0.8, "duck": [{"name": "presenter", "threshold": -30, "floor": 0.05, "attack": 30, "hold": 60, "release": 400}]}
]},
{"name": "captions", "layer": 40, "elements": []}
]
}