Upload blend_5050.sh with huggingface_hub
Browse files- blend_5050.sh +46 -33
blend_5050.sh
CHANGED
|
@@ -1,45 +1,58 @@
|
|
| 1 |
#!/bin/bash
|
| 2 |
-
# blend_5050.sh — 100% gesynchroniseerde 50/50 blend van LTX + Flux1 colorize.
|
| 3 |
-
# Lost
|
| 4 |
-
#
|
| 5 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
set -e
|
| 7 |
-
LTX="$1"; FLUX="$2"; AUDIO="$3"; OUT="$4";
|
| 8 |
TMP=$(mktemp -d)
|
| 9 |
-
|
| 10 |
|
| 11 |
-
#
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
|
| 16 |
-
# STAP 1:
|
| 17 |
-
|
| 18 |
-
ffmpeg -y -loglevel error -i "$
|
| 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:
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
echo "[
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
|
| 27 |
-
# STAP 3:
|
| 28 |
-
|
| 29 |
-
|
|
|
|
|
|
|
|
|
|
| 30 |
|
| 31 |
-
# STAP 4: 50/50 blend + audio (beide
|
| 32 |
-
ffmpeg -y -loglevel error -i "$TMP/
|
| 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 +
|
| 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/
|
| 41 |
-
|
| 42 |
done
|
| 43 |
-
echo "[
|
| 44 |
-
|
| 45 |
-
echo "[BLEND] klaar -> $OUT"
|
|
|
|
| 1 |
#!/bin/bash
|
| 2 |
+
# blend_5050.sh v2 — robuuste, 100% gesynchroniseerde 50/50 blend van LTX + Flux1 colorize.
|
| 3 |
+
# Lost ALLE bekende desync-oorzaken op:
|
| 4 |
+
# (1) broken container (24fps-content-als-30fps -> 226s): force schone 30fps CFR.
|
| 5 |
+
# (2) ongelijke frame-counts (LTX 67x81=5427 vs Flux1 ~5405): trim naar min.
|
| 6 |
+
# (3) ASPECT/framing-verschil (LTX 1.765 vs Flux1 1.894 -> ghosting): crop de bredere
|
| 7 |
+
# naar de aspect van de smallere, gecentreerd -> content pixel-op-pixel.
|
| 8 |
+
# (4) "rare f0" / leading-black: detecteert + rapporteert (align-overlays vangen offset af).
|
| 9 |
+
# Verificatie: 50/50 overlay-frames (f0/midden/eind). SCHERP = aligned, GHOSTING = mis.
|
| 10 |
+
# Usage: blend_5050.sh <LTX.mp4> <FLUX.mp4> <AUDIO> <OUT.mp4> [OUTRES=1920:1080]
|
| 11 |
set -e
|
| 12 |
+
LTX="$1"; FLUX="$2"; AUDIO="$3"; OUT="$4"; OUTRES="${5:-1920:1080}"
|
| 13 |
TMP=$(mktemp -d)
|
| 14 |
+
dims(){ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 "$1"; }
|
| 15 |
|
| 16 |
+
# STAP 0: leading-black detectie (vang de "rare f0" af)
|
| 17 |
+
echo "[BLACK] leading-black check (eerste 1.5s):"
|
| 18 |
+
for tag in LTX FLUX; do
|
| 19 |
+
src=$([ "$tag" = LTX ] && echo "$LTX" || echo "$FLUX")
|
| 20 |
+
bd=$(ffmpeg -loglevel info -i "$src" -vf "blackdetect=d=0.01:pix_th=0.10" -t 1.5 -an -f null - 2>&1 | grep -oE 'black_end:[0-9.]+' | head -1)
|
| 21 |
+
echo " $tag: ${bd:-geen}"
|
| 22 |
+
done
|
| 23 |
+
echo "[BLACK] -> als deze sterk verschillen kan er een offset zijn; de align-overlays onderaan tonen het."
|
| 24 |
|
| 25 |
+
# STAP 1: beide naar SCHONE 30fps CFR (retiming repareert broken 24-als-30fps; geen resample)
|
| 26 |
+
ffmpeg -y -loglevel error -i "$LTX" -vf "settb=AVTB,setpts=N/30/TB" -r 30 -vsync cfr -an -c:v libx264 -crf 16 "$TMP/l.mp4"
|
| 27 |
+
ffmpeg -y -loglevel error -i "$FLUX" -vf "settb=AVTB,setpts=N/30/TB" -r 30 -vsync cfr -an -c:v libx264 -crf 16 "$TMP/f.mp4"
|
|
|
|
| 28 |
|
| 29 |
+
# STAP 2: ASPECT matchen -> crop de bredere naar de aspect van de smallere (gecentreerd) + scale
|
| 30 |
+
IFS=, read WL HL < <(dims "$TMP/l.mp4"); IFS=, read WF HF < <(dims "$TMP/f.mp4")
|
| 31 |
+
AL=$(awk "BEGIN{printf \"%.5f\",$WL/$HL}"); AF=$(awk "BEGIN{printf \"%.5f\",$WF/$HF}")
|
| 32 |
+
TA=$(awk "BEGIN{print ($AL<$AF)?$AL:$AF}")
|
| 33 |
+
echo "[ASPECT] LTX=${WL}x${HL}(${AL}) FLUX=${WF}x${HF}(${AF}) -> doel-aspect=${TA}"
|
| 34 |
+
cropfit(){ local w="$1" h="$2"; local cw=$(awk "BEGIN{c=int($h*$TA); c-=c%2; print c}")
|
| 35 |
+
if [ "$cw" -lt "$w" ]; then echo "crop=${cw}:${h}:$(awk "BEGIN{print int(($w-$cw)/2)}"):0,"; else echo ""; fi; }
|
| 36 |
+
ffmpeg -y -loglevel error -i "$TMP/l.mp4" -vf "$(cropfit $WL $HL)scale=${OUTRES},setsar=1" -c:v libx264 -crf 16 "$TMP/lA.mp4"
|
| 37 |
+
ffmpeg -y -loglevel error -i "$TMP/f.mp4" -vf "$(cropfit $WF $HF)scale=${OUTRES},setsar=1" -c:v libx264 -crf 16 "$TMP/fA.mp4"
|
| 38 |
|
| 39 |
+
# STAP 3: frame-counts gelijk (trim naar min, aligned vanaf frame 0)
|
| 40 |
+
NL=$(ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets -of csv=p=0 "$TMP/lA.mp4")
|
| 41 |
+
NF=$(ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets -of csv=p=0 "$TMP/fA.mp4")
|
| 42 |
+
N=$(( NL < NF ? NL : NF )); echo "[SYNC] LTX=$NL FLUX=$NF -> trim naar $N"
|
| 43 |
+
ffmpeg -y -loglevel error -i "$TMP/lA.mp4" -frames:v "$N" -c:v libx264 -crf 16 "$TMP/lN.mp4"
|
| 44 |
+
ffmpeg -y -loglevel error -i "$TMP/fA.mp4" -frames:v "$N" -c:v libx264 -crf 16 "$TMP/fN.mp4"
|
| 45 |
|
| 46 |
+
# STAP 4: 50/50 blend + audio (beide IDENTIEK N frames @ 30fps CFR, zelfde framing -> 100% sync)
|
| 47 |
+
ffmpeg -y -loglevel error -i "$TMP/lN.mp4" -i "$TMP/fN.mp4" -i "$AUDIO" \
|
| 48 |
+
-filter_complex "[0:v][1:v]blend=all_mode=average[v]" -map "[v]" -map "2:a" -shortest -r 30 -vsync cfr -c:v libx264 -crf 16 -c:a aac "$OUT"
|
|
|
|
| 49 |
|
| 50 |
+
# STAP 5: verifieer + align-overlays (50/50 van enkel-frames: scherp=aligned, ghost=mis)
|
|
|
|
| 51 |
VDIR="$(dirname "$OUT")/align_check"; mkdir -p "$VDIR"
|
| 52 |
for fr in 0 $((N/2)) $((N-1)); do
|
| 53 |
+
ffmpeg -y -loglevel error -i "$TMP/lN.mp4" -i "$TMP/fN.mp4" \
|
| 54 |
+
-filter_complex "[0:v]select=eq(n\,$fr)[a];[1:v]select=eq(n\,$fr)[b];[a][b]blend=all_mode=average" -frames:v 1 "$VDIR/overlay_f${fr}.png"
|
| 55 |
done
|
| 56 |
+
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' ' ')"
|
| 57 |
+
echo "[ALIGN] overlay-frames in $VDIR -> scherp = perfect aligned"
|
| 58 |
+
rm -rf "$TMP"; echo "[BLEND] klaar -> $OUT"
|