Cinematic Reel Editor
Verwandeln Sie einen Ordner mit Rohclips + einem Musikstück in einen 15–45 s langen, 9:16, beat-synchronisierten Kinofilm. Die gesamte Bearbeitung erfolgt mit FFmpeg über die Kommandozeile. Der Plan befindet sich in einer bearbeitbaren Schnittliste (edl.json), sodass Änderungen ohne Neustart neu gerendert werden können.
0. Harte Regeln
- Ändern oder löschen Sie NIEMALS etwas in
raw/. Schreiben Sie alle Ausgaben nachwork/undout/. - Die Musik muss vom Benutzer bereitgestellt werden (lizenziert / lizenzfrei). Wenn
music/leer ist, fragen Sie nach einem Track – laden Sie keine urheberrechtlich geschützte Musik herunter. - Zeigen Sie dem Benutzer den Shot-Plan (Schritt 4) und holen Sie dessen Zustimmung vor dem endgültigen Rendern ein.
- Bevorzugen Sie harte Schnitte auf den Beats. Verwenden Sie Übergänge sparsam (max. 2–3 pro Film).
1. Voraussetzungen prüfen
ffmpeg -version && ffprobe -version
python3 -c "import librosa, numpy" || pip install librosa numpy soundfile
Wenn FFmpeg fehlt, fordern Sie den Benutzer auf, es zu installieren (Windows: winget install ffmpeg, Mac: brew install ffmpeg, Linux: sudo apt install ffmpeg) und brechen Sie ab.
2. Ordnerstruktur
projekt/
raw/ # Kamera-Clips (schreibgeschützt)
music/ # ein Musikstück
luts/ # optionale .cube-LUT für Farbkorrektur
work/ # Thumbnails, Segmente, edl.json, beats.json
out/ # endgültige Render (reel_v1.mp4, reel_v2.mp4 ...)
3. Bestandsaufnahme und Begutachtung des Filmmaterials
Notieren Sie für jeden Clip Dauer, Auflösung, Bildrate und Ausrichtung:
ffprobe -v error -show_entries format=duration:stream=width,height,r_frame_rate,codec_type -of json raw/CLIP.mp4
Erstellen Sie ein Kontaktblatt pro Clip (ein Bild alle 2 s) und BETRACHTEN Sie es mit dem Read-Tool, um zu wissen, was in jeder Aufnahme ist:
ffmpeg -y -i raw/CLIP.mp4 -vf "fps=1/2,scale=320:-1,tile=4x3" -frames:v 1 work/thumbs/CLIP.jpg
Taggen Sie jeden nutzbaren Moment: Aufnahmeart (Weit / Mittel / Nahaufnahme / Detail), Motiv, Bewegung, Qualität (scharf, stabil, gut belichtet) und ob er für Zeitlupe geeignet ist (Quelle ≥ 50 fps).
4. Die Geschichte aufbauen (Shot-Plan)
Strukturieren Sie jeden Film wie folgt:
- Hook (0–2 s) – der auffälligste Schuss. Kein Logo oder Textintro.
- Aufbau – Details und Spannung (Nahaufnahmen, Zeitlupe).
- Heldenmoment – auf dem größten Beat / Musik-Drop.
- Emotion / Auszahlung – Reaktionen, Menschen, Feierlichkeiten.
- Outro (letzte 2–3 s) – sauberer Weitwinkel, optional Text oder Logo, Musik ausgeblendet.
Vorlage für Autolieferungen (an das Material anpassen): Außenansicht Weit → Logo-Nahaufnahme → Rad/Scheinwerfer-Details → Familie hereinkommend (Zeitlupe) → Enthüllung (auf dem Drop) → Schlüsselübergabe → Reaktionen/Lächeln → Innenraum + Lenkrad → Kuchen / Girlande / Pooja → erste Abfahrt (Weitwinkel, Outro).
Regeln: Variieren Sie die Aufnahmegrößen (niemals zwei Weitwinkel hintereinander), halten Sie jede Aufnahme 0,5–2,5 s, verwenden Sie Zeitlupe nur für emotionale oder Enthüllungsaufnahmen, schneiden Sie nach Möglichkeit auf Bewegungen.
5. Beat-Erkennung
# work/beats.py
import librosa, json, sys
y, sr = librosa.load(sys.argv[1])
tempo, frames = librosa.beat.beat_track(y=y, sr=sr)
beats = librosa.frames_to_time(frames, sr=sr).tolist()
onset = librosa.onset.onset_strength(y=y, sr=sr)
json.dump({"tempo": float(tempo), "beats": beats}, open("work/beats.json", "w"), indent=1)
print(f"tempo {float(tempo):.1f} BPM, {len(beats)} beats")
Schneiden Sie auf den Beats (jeder Beat für schnelle Abschnitte, jeder 2. oder 4. Beat für langsame). Finden Sie den Drop (größter Energieanstieg) und platzieren Sie dort den Heldenmoment.
6. Schnittliste schreiben: work/edl.json
{
"output": {"w": 1080, "h": 1920, "fps": 30},
"music": {"file": "music/track.mp3", "start": 12.0, "fade_out": 1.5},
"grade": {"lut": "luts/teal_orange.cube", "vignette": true},
"shots": [
{"id": 1, "src": "raw/C0001.mp4", "in": 4.20, "dur": 1.40, "speed": 1.0, "crop_x": "center", "note": "hook – auto weit"},
{"id": 2, "src": "raw/C0007.mp4", "in": 10.0, "dur": 1.00, "speed": 0.5, "crop_x": "center", "note": "rad zeitlupe"}
],
"transitions": [{"after_shot": 4, "type": "fade", "dur": 0.3}],
"text": [{"text": "Willkommen Zuhause", "start": 18.0, "end": 21.0}]
}
dur ist die Länge auf der Zeitleiste. Bei speed 0.5 beträgt der verwendete Quellbereich dur × speed Sekunden. Zeigen Sie dem Benutzer diesen Plan als einfache Tabelle (Aufnahme, Zeit, Beschreibung) vor dem Rendern an.
7. Jede Aufnahme als einheitliches Segment rendern
Jedes Segment muss identische Auflösung, Bildrate, Pixelformat und kein Audio haben, damit sie sauber zusammengefügt werden können:
# Landschaftsquelle → 9:16 Cropping, Geschwindigkeit, Grading
ffmpeg -y -ss IN -t SRC_DUR -i raw/CLIP.mp4 -an -vf "\
setpts=PTS/SPEED,\
scale=-2:1920,crop=1080:1920,\
fps=30,\
lut3d=luts/teal_orange.cube,\
eq=contrast=1.06:saturation=1.10,\
vignette=PI/5,\
format=yuv420p" \
-c:v libx264 -crf 16 -preset medium work/seg_01.mp4
SRC_DUR = dur × speed. Verwenden Sie für Zeitlupe eine Quelle mit hoher Bildrate; vermeiden Sieminterpolate, sofern nicht verlangt (langsam und Artefakte).- Vertikale Quelle: Verwenden Sie
scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920. - Keine LUT verfügbar: Verwenden Sie
eq=contrast=1.08:saturation=1.15:gamma=0.98pluscurves=preset=increase_contrastfür einen kinoreifen Look. - Optionale Kinobalken werden bei 9:16-Filmen NICHT verwendet.
8. Segmente zusammenfügen
Keine Übergänge – Concat Demuxer:
printf "file 'seg_%02d.mp4'\n" 1 2 3 ... > work/list.txt
ffmpeg -y -f concat -safe 0 -i work/list.txt -c copy work/video.mp4
Bei einem Übergang zwischen zwei Segmenten verwenden Sie xfade (Offset = Länge des ersten Clips − Übergangsdauer):
ffmpeg -y -i work/seg_04.mp4 -i work/seg_05.mp4 -filter_complex \
"[0][1]xfade=transition=fade:duration=0.3:offset=1.2,format=yuv420p" work/seg_04_05.mp4
Jeder Übergang verkürzt die Zeitleiste um seine Dauer – überprüfen Sie die Beat-Ausrichtung erneut.
9. Musik, Text, endgültiger Export
ffmpeg -y -i work/video.mp4 -ss MUSIC_START -i music/track.mp3 -filter_complex "\
[1:a]afade=t=in:d=0.3,afade=t=out:st=FADE_START:d=1.5,loudnorm=I=-14:TP=-1:LRA=11[a];\
[0:v]drawtext=fontfile=SCHRIFTART.ttf:text='Willkommen Zuhause':fontsize=72:fontcolor=white:\
x=(w-text_w)/2:y=h*0.72:enable='between(t,18,21)':alpha='if(lt(t,18.4),(t-18)/0.4,1)'[v]" \
-map "[v]" -map "[a]" -shortest \
-c:v libx264 -crf 18 -preset slow -profile:v high -pix_fmt yuv420p -r 30 \
-c:a aac -b:a 192k -movflags +faststart out/reel_v1.mp4
Finden Sie eine Schriftart auf dem Rechner für drawtext (oder fragen Sie nach). Halten Sie Text minimal, innerhalb des sicheren Bereichs (vermeiden Sie die oberen 15% und unteren 25%, wo die Instagram-UI sitzt).
10. Qualitätskontrolle (immer)
ffprobe out/reel_vN.mp4→ 1080×1920, 30 fps, H.264, AAC, Dauer wie geplant.- Kontaktblatt des endgültigen Films (
fps=2,scale=270:-1,tile=6x5) und betrachten: keine schwarzen Frames, keine falschen Zuschnitte (abgeschnittene Köpfe), konsistente Farbe. - Überprüfen Sie die Lautstärke und dass der Heldenmoment auf dem Drop landet.
- Berichten Sie dem Benutzer: Dauer, Anzahl der Aufnahmen, Dateipfad und alles, worüber Sie sich unsicher waren.
11. Überarbeitungen
Nie neu anfangen. Bearbeiten Sie work/edl.json (eine Aufnahme austauschen, in/dur ändern, Geschwindigkeit, Text, Grading), rendern Sie nur die geänderten Segmente neu, fügen Sie sie wieder zusammen und exportieren Sie als nächste Version (reel_v2.mp4). Behalten Sie alte Versionen, damit der Benutzer sie vergleichen kann.