
需求
我需要参考某个番剧/电影的某些画面,如果要一个一个截,拉进度条+截图好费时间啊
解决
- 使用ffmpeg做画面变换检测,获取切割点
- 去除掉一拍二/一拍三情况、获取中间帧
- ffmpeg按时间点截图
【点击下载(百度云)】

注意事项
!!本程序无法完美识别每一个cut,只用于优化拉进度条频繁截图的繁琐工作
- 请确保ffmpeg.exe在该程序旁边,或已位于系统路径
- 第一阶段识别平均每20分钟视频需要2分钟解析
打包备忘
获取ffmpeg.exe
pyinstaller --onefile --windowed --icon="./src/icon.ico" --add-binary "ffmpeg.exe;." video_frame_extractor.py
|
原bash版本备忘
ffmpeg -i $input -vf "select='gt(scene,0.17)',showinfo" -f null - 2>&1 | grep "pts_time:" | awk -F'pts_time:' '{print $2}' | awk '{print $1}' > timestamps.txt
awk ' BEGIN { prev = 0; threshold = 0.15; # 固定阈值 } NR == 1 { print; # 第一行总是保留 prev = $1; next; } { if ($1 - prev >= threshold) { print; prev = $1; } } ' timestamps.txt > filtered_timestamps.txt
awk ' NR == 1 { prev = $1; next } # 跳过第一行 { mid = (prev + $1) / 2; # 计算中间值 print mid; prev = $1; } ' filtered_timestamps.txt > filtered_timestamps2.txt
offset=0.05 mkdir 01 while read -r timestamp; do prev_time=$(awk "BEGIN {print $timestamp - $offset}") if (( $(echo "$prev_time >= 0" | awk '{print ($1 >= 0)}') )); then ffmpeg -ss "$prev_time" -i $input -vframes 1 -q:v 2 "./01/prev_frame_${timestamp}.png" -y else echo "跳过 timestamp=$timestamp(时间超出开头)" fi done < filtered_timestamps2.txt
|