59 lines
1.5 KiB
Bash
59 lines
1.5 KiB
Bash
#! /bin/bash
|
|
|
|
py="$(cat <<EOF
|
|
from sys import stdin; lines = [i.strip() for i in stdin.readlines()];
|
|
def keyword(line):
|
|
return "keep" if "keep" in line else "drop"
|
|
somelines = lines[:1]
|
|
for i in range(1, len(lines)):
|
|
if keyword(somelines[-1]) != keyword(lines[i]):
|
|
somelines.append(lines[i-1])
|
|
somelines.append(lines[i])
|
|
somelines = [(keyword(i), 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 -loglevel debug -f null - 2>&1 \
|
|
| grep Parsed_mpdecimate_0 \
|
|
| grep -E ' (keep|drop) ' \
|
|
| python3 -c "$py"
|
|
); 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"
|