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