Як і згадується @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але розібрали вихід по-різному. Не маю ідеї, як виконати перейменування там.