Как упомянуто @dstob, вы можете использовать ffprobe
для получения I-кадров и связанной с ними информации. ffprobe
поставляется с некоторыми статическими сборками на странице загрузки и может быть также собран из исходного кода.
Предполагается, что вы работаете в Linux/Unix:
Извлечь кадры и типы кадров
ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1
Команда grep
фильтрует строки с I
в них и подсчитывает их индекс (используя опцию -n
). Команда cut
выбирает только первый столбец выходных данных (индекс). Обратите внимание, что этот индекс основан на 1, а не на 0.
Переименовать выходные файлы на основе индекса
Вы можете фактически передать эти индексы в список:
ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1 > frame_indices.txt
Затем составьте список всех миниатюр:
ls -1 thumbnails*.jpeg > thumbnails.txt
Затем вставьте эти два вместе:
paste thumbnails.txt frame_indices.txt > combined.txt
Теперь список содержит название миниатюры и индекс. Выполните переименование на основе этого:
while read -r thumbnail index; do
newIndex=$(echo $index - 1 | bc) # subtract 1 from the index
mv -- "$thumbnail" "thumbnail-$newIndex.jpeg" # rename file
done < combined.txt
Выше будет переименовать thumbnail-01.jpeg
в thumbnail-0.jpeg
. Обратите внимание, что в выходном индексе нет нуля. Если вы хотите добавить к нулю, скажем, 5 цифр, используйте printf
:
newIndex=$(printf '%05d' $(echo $index - 1 | bc))
В Windows вы делаете то же самое с ffprobe
но анализируете вывод иначе. Не знаю, как выполнить переименование там, хотя.