Как упомянуто @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
но по-разному проанализировали результат. Не знаю, как выполнить переименование там, хотя.