我需要将视频分成许多小视频。我试过PySceneDetect,它的2种场景检测方法不符合我的需要。
这个想法是每次音量时触发场景剪切/中断…
使用 silencedetect 音频过滤器并将其调试输出提供给 segment 输出格式参数。
silencedetect
segment
这里有一个现成的脚本:
#!/bin/bash IN=$1 OUT=$2 true ${SD_PARAMS:="-55dB:d=0.3"}; true ${MIN_FRAGMENT_DURATION:="20"}; export MIN_FRAGMENT_DURATION if [ -z "$OUT" ]; then echo "Usage: split_by_silence.sh input_media.mp4 output_template_%03d.mkv" echo "Depends on FFmpeg, Bash, Awk, Perl 5. Not tested on Mac or Windows." echo "" echo "Environment variables (with their current values):" echo " SD_PARAMS=$SD_PARAMS Parameters for FFmpeg's silencedetect filter: noise tolerance and minimal silence duration" echo " MIN_FRAGMENT_DURATION=$MIN_FRAGMENT_DURATION Minimal fragment duration" exit 1 fi echo "Determining split points..." >& 2 SPLITS=$( ffmpeg -nostats -v repeat+info -i "${IN}" -af silencedetect="${SD_PARAMS}" -vn -sn -f s16le -y /dev/null \ |& grep '\[silencedetect.*silence_start:' \ | awk '{print $5}' \ | perl -ne ' our $prev; INIT { $prev = 0.0; } chomp; if (($_ - $prev) >= $ENV{MIN_FRAGMENT_DURATION}) { print "$_,"; $prev = $_; } ' \ | sed 's!,$!!' ) echo "Splitting points are $SPLITS" ffmpeg -v warning -i "$IN" -c copy -map 0 -f segment -segment_times "$SPLITS" "$OUT"
您指定输入文件,输出文件模板,静音检测参数和最小片段大小,它会写入多个文件。
静音检测参数可能需要被调谐:
SD_PARAMS
-55dB:d=0.3
-55dB
-70dB
-40dB
d=0.3
MIN_FRAGMENT_DURATION
如果根本没有检测到静音,脚本将失败。
有一个 Github Gist上的重构版本 ,但是对于一个用户来说存在问题。