Quiet
  • 封面
  • 作品集
  • 分栏
  • 标记
  • 时间线
  • 外链
  • 关于我

可能是水桶吧

  • 封面
  • 作品集
  • 分栏
  • 标记
  • 时间线
  • 外链
  • 关于我
Quiet主题 Quiet主题 Quiet主题 Quiet主题 Quiet主题
  • TA
  • 程序开发

视频文件自动截取关键帧作为参考图的工具

可能是水桶吧
工具与其他

2025-08-10 01:13:16

需求

我需要参考某个番剧/电影的某些画面,如果要一个一个截,拉进度条+截图好费时间啊

解决

  1. 使用ffmpeg做画面变换检测,获取切割点
  2. 去除掉一拍二/一拍三情况、获取中间帧
  3. ffmpeg按时间点截图

【点击下载(百度云)】

注意事项

!!本程序无法完美识别每一个cut,只用于优化拉进度条频繁截图的繁琐工作

  1. 请确保ffmpeg.exe在该程序旁边,或已位于系统路径
  2. 第一阶段识别平均每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

# 4. 批量截图
offset=0.05 # 偏移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
下一篇

使用Layer weight作为轮廓光钳制的表现方法

©2025 By 可能是水桶吧
备案信息:粤ICP备2025400795号
Quiet主题 Quiet主题 Quiet主题 Quiet主题 Quiet主题