#! /bin/bash py="$(cat < i+1: stop = float(state_transition_lines_video[i+1][1]) if stop - start > 1: spans_to_keep_video.append((start, stop)) else: spans_to_keep_video.append((start, duration)) spans_to_keep_audio = [ (state_transition_lines_audio[i], state_transition_lines_audio[i+1]) for i in range(0, len(state_transition_lines_audio), 2) ] # drop zero len spans spans_to_keep_video = [i for i in spans_to_keep_video if i[1]-i[0] > 0.1] spans_to_keep_audio = [i for i in spans_to_keep_audio if i[1]-i[0] > 0.1] # extend around for arr in [spans_to_keep_video, spans_to_keep_audio]: for i in range(len(arr)): arr[i] = ( max(0.0, arr[i][0] - 1.0), min(duration, arr[i][1] + 1.0), ) # combine near for arr in [spans_to_keep_video, spans_to_keep_audio]: for i in range(len(arr)-1, 0, -1): first_start, first_stop = arr[i-1] secnd_start, secnd_stop = arr[i] if secnd_start - first_stop < 5: arr = arr[:i-1] + [(first_start, secnd_stop)] + arr[i+1:] # union audio, video spans spans_to_keep = spans_to_keep_video + spans_to_keep_audio spans_to_keep = sorted(spans_to_keep) for i in range(len(spans_to_keep)-1, 0, -1): first_start, first_stop = spans_to_keep[i-1] secnd_start, secnd_stop = spans_to_keep[i] if secnd_start - first_stop < 5: spans_to_keep = spans_to_keep[:i-1] + [(first_start, secnd_stop)] + spans_to_keep[i+1:] print("\n".join([ f'AUDIO: {i[0]:.2f},{i[1]-i[0]:.2f}' for i in spans_to_keep_audio ]), file=stderr) print("\n".join([ f'VIDEO: {i[0]:.2f},{i[1]-i[0]:.2f}' for i in spans_to_keep_video ]), file=stderr) # output print("\n".join([ f'{i[0]:.2f},{i[1]-i[0]:.2f}' for i in spans_to_keep ])) 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" ); 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"