我正在尝试制作一个脚本,以使用bash和ffmpeg的时间间隔(例如,每秒1个屏幕截图)批处理屏幕截图视频 但是问题是ffmpeg没有选择输出带有包含视频中时间戳的文件名的帧(不是本地计算机时间)。
我已经找到了一些骇人听闻的解决方案来做到这一点,但是它们都是错误的,不准确的,并且不能在所有用例(例如可变帧率的视频)中都起作用
那么,有没有更好的解决方案或工具可以完成此类任务?
#!/bin/bash
for i in *.$1; do #define video extension
if [ ! -d "$PWD/${i%.*}" ]; then #if directory does not exist yet
mkdir -p "${i%.*}" #create folder based on filename
ffmpeg -i "$i" -vf fps="1/$2" "$PWD/${i%.*}/${i%.*}.%04d.png" #output screenshots
fi
done
编辑: 我根据Gyan的答案重制了剧本
如果有更多专业知识的人可以指出任何错误,请这样做。
#!/bin/bash
#./batch_screenshot.sh [video format] [screenshot interval in seconds]
#given video1.mp4, video2.mp4, etc. within a directory, script will output the video screenshots to folders called video1, video2, etc. with the image filename of video1 - HH-MM-SS.png, video2 - HH-MM-SS.png, etc.
orig="$PWD"
for i in *.$1; do
if [ ! -d "$PWD/${i%.*}" ]; then #if directory does not exist yet
mkdir -p "${i%.*}" #create them
ffmpeg -i "$i" -vf select="floor(t*1/$2)-floor(prev_t*1/$2)" -r 1000 -vsync 0 -frame_pts true "$PWD/${i%.*}/%d.png" #output screenshots
cd "$PWD/${i%.*}"
for r in *.png; do #batch rename all the output files
seconds=$(( "${r%.*}" / 1000 )) #convert miliseconds in filename to seconds
timestamp=$(date -d@"$seconds" -u +%H-%M-%S) #convert seconds to hh:mm:ss format
mv "$r" "${i%.*} - $timestamp.png" #rename
done
cd "$orig"
fi
done
答案 0 :(得分:0)
您可以安装允许从maim之类的脚本中截取屏幕截图的工具(如果使用ubuntu,则可以使用apt-get install maim进行安装)。
然后您可以像这样循环执行它:
while : ; do
maim "path_and_file_prefix_$(date +%Y%m%d_%H%M%S).jpeg"
sleep 1s
done