home-video-blue-extractinator/src-lib/testdata/poc.sh

71 lines
1.9 KiB
Bash

#! /bin/bash
py="$(cat <<EOF
from sys import stdin, stderr
lines = [i.strip() for i in stdin.readlines()]
def frame_duplicate_status(line):
return "keep" if "keep" in line else "drop", "Parsed_mpdecimate_0" in line
somelines = []
for i in range(len(lines)):
status, relevant = frame_duplicate_status(lines[i])
if not relevant:
continue
if not somelines:
somelines.append(lines[i])
else:
prev_status, _ = frame_duplicate_status(somelines[-1])
if status != prev_status:
somelines.append(lines[i-1])
somelines.append(lines[i])
somelines = [(frame_duplicate_status(i)[0], i.split("pts_time:")[1].split()[0]) for i in somelines]
# just the keeps
somelines = [i for i in somelines[2:] if i[0] == "keep"]
# translate to floats
drops = []
for i in range(0, len(somelines), 2):
start = float(somelines[i][1])
if len(somelines) > i+1:
stop = float(somelines[i+1][1])
if stop - start > 1:
drops.append((start, stop))
#else:
# drops.append((start, "inf"))
# extend around
for i in range(len(drops)):
drops[i] = (drops[i][0] - 1.0, drops[i][1] + 1.0)
# combine near
for i in range(len(drops)-1, 0, -1):
first_start, first_stop = drops[i-1]
secnd_start, secnd_stop = drops[i]
if secnd_start - first_stop < 5:
drops = drops[:i-1] + [(first_start, secnd_stop)] + drops[i+1:]
# output
print("\n".join([
f'{i[0]:.2f},{i[1]-i[0]:.2f}' for i in drops
]))
EOF
)"
d=$(mktemp -d)
echo d=$d >&2
for span in $(
(
ffmpeg -i $f -vf mpdecimate -af silencedetect=n=-50dB:d=1 -loglevel debug -f null -
#ffmpeg -i "$f" -af silencedetect=n=-50dB:d=1 -loglevel debug -f null -
) 2>&1 \
| grep -E 'silencedetect|Parsed_mpdecimate_0|Duration: *[0-9]' \
| grep -E 'silencedetect| (keep|drop) |Duration: *[0-9]' \
| python3 -c "$py" >&2
); do
n=$((n+1))
ffmpeg -y -ss ${span%,*} -i "$f" -t ${span#*,} "$d/$(printf "%05d" $(ls "$d" | wc -l)).${f##*.}"
done
ls $d
echo rm -rf "$d"