HaaDeej commited on
Commit
5757d73
·
verified ·
1 Parent(s): d1680fa

Upload blend_5050.sh with huggingface_hub

Browse files
Files changed (1) hide show
  1. 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 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"
 
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"