Upload blend_5050.sh with huggingface_hub
Browse files- blend_5050.sh +45 -0
blend_5050.sh
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
# blend_5050.sh — 100% gesynchroniseerde 50/50 blend van LTX + Flux1 colorize.
|
| 3 |
+
# Lost de bekende desync op: (1) broken container (24fps-content-als-30fps -> 226s),
|
| 4 |
+
# (2) ongelijke frame-counts (LTX 67x81=5427 vs Flux1 ~5400). Aligned vanaf frame 0.
|
| 5 |
+
# Usage: blend_5050.sh <LTX.mp4> <FLUX.mp4> <AUDIO.m4a> <OUT.mp4> [WxH]
|
| 6 |
+
set -e
|
| 7 |
+
LTX="$1"; FLUX="$2"; AUDIO="$3"; OUT="$4"; RES="${5:-1920:1080}"
|
| 8 |
+
TMP=$(mktemp -d)
|
| 9 |
+
echo "[BLEND] LTX=$LTX FLUX=$FLUX res=$RES"
|
| 10 |
+
|
| 11 |
+
# Bron-specs (diagnose)
|
| 12 |
+
probe(){ ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets,r_frame_rate,avg_frame_rate -show_entries format=duration -of default=nw=1 "$1"; }
|
| 13 |
+
echo "[BRON LTX ]"; probe "$LTX"
|
| 14 |
+
echo "[BRON FLUX]"; probe "$FLUX"
|
| 15 |
+
|
| 16 |
+
# STAP 1: forceer beide naar SCHONE 30fps CFR (settb+setpts = retiming dat een broken
|
| 17 |
+
# 24fps-als-30fps container repareert; -vsync cfr borgt constante frametiming). Geen resample.
|
| 18 |
+
ffmpeg -y -loglevel error -i "$LTX" -vf "settb=AVTB,setpts=N/30/TB,scale=${RES},setsar=1" -r 30 -vsync cfr -an -c:v libx264 -crf 16 "$TMP/ltx30.mp4"
|
| 19 |
+
ffmpeg -y -loglevel error -i "$FLUX" -vf "settb=AVTB,setpts=N/30/TB,scale=${RES},setsar=1" -r 30 -vsync cfr -an -c:v libx264 -crf 16 "$TMP/flux30.mp4"
|
| 20 |
+
|
| 21 |
+
# STAP 2: exacte frame-counts -> gemeenschappelijke lengte = min (aligned vanaf frame 0)
|
| 22 |
+
NL=$(ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets -of csv=p=0 "$TMP/ltx30.mp4")
|
| 23 |
+
NF=$(ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets -of csv=p=0 "$TMP/flux30.mp4")
|
| 24 |
+
N=$(( NL < NF ? NL : NF ))
|
| 25 |
+
echo "[SYNC] LTX=$NL, FLUX=$NF frames -> trim beide EXACT naar $N"
|
| 26 |
+
|
| 27 |
+
# STAP 3: trim beide naar N frames
|
| 28 |
+
ffmpeg -y -loglevel error -i "$TMP/ltx30.mp4" -frames:v "$N" -c:v libx264 -crf 16 "$TMP/ltxN.mp4"
|
| 29 |
+
ffmpeg -y -loglevel error -i "$TMP/flux30.mp4" -frames:v "$N" -c:v libx264 -crf 16 "$TMP/fluxN.mp4"
|
| 30 |
+
|
| 31 |
+
# STAP 4: 50/50 blend + audio (beide nu IDENTIEK N frames @ 30fps CFR -> 100% synchroon)
|
| 32 |
+
ffmpeg -y -loglevel error -i "$TMP/ltxN.mp4" -i "$TMP/fluxN.mp4" -i "$AUDIO" \
|
| 33 |
+
-filter_complex "[0:v][1:v]blend=all_mode=average[v]" \
|
| 34 |
+
-map "[v]" -map "2:a" -shortest -r 30 -vsync cfr -c:v libx264 -crf 16 -c:a aac "$OUT"
|
| 35 |
+
|
| 36 |
+
# STAP 5: verifieer + extraheer alignment-frames (frame 0, midden, eind) van beide bronnen
|
| 37 |
+
echo "[VERIFY OUT] $(ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets,r_frame_rate -show_entries format=duration -of default=nw=1 "$OUT" | tr '\n' ' ')"
|
| 38 |
+
VDIR="$(dirname "$OUT")/align_check"; mkdir -p "$VDIR"
|
| 39 |
+
for fr in 0 $((N/2)) $((N-1)); do
|
| 40 |
+
ffmpeg -y -loglevel error -i "$TMP/ltxN.mp4" -vf "select=eq(n\,$fr)" -frames:v 1 "$VDIR/f${fr}_ltx.png"
|
| 41 |
+
ffmpeg -y -loglevel error -i "$TMP/fluxN.mp4" -vf "select=eq(n\,$fr)" -frames:v 1 "$VDIR/f${fr}_flux.png"
|
| 42 |
+
done
|
| 43 |
+
echo "[ALIGN] check-frames in $VDIR (f0/fmid/fend, ltx vs flux -- moeten dezelfde scene tonen)"
|
| 44 |
+
rm -rf "$TMP"
|
| 45 |
+
echo "[BLEND] klaar -> $OUT"
|