Снимок экрана с интервалом времени - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь создать скрипт для пакетной записи видео с интервалом с помощью 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

EDIT: Я переделал свой сценарий на основе ответа Гаяна

Если кто-то с большим опытом может указать на какие-либо ошибки, пожалуйста, сделайте это.

#!/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

1 Ответ

0 голосов
/ 06 июня 2019

Вы можете установить инструменты, позволяющие делать скриншоты из сценария, такого как maim (если вы используете ubuntu, вы можете установить его с помощью apt-get install maim).

Затем вы можете выполнить его в цикле, например:

while : ; do
    maim "path_and_file_prefix_$(date +%Y%m%d_%H%M%S).jpeg"
    sleep 1s
done
...