Jak wspomniano o @dstob, możesz użyć, ffprobe
aby uzyskać ramki I i powiązane z nimi informacje. ffprobe
jest dostarczany z niektórymi statycznymi kompilacjami na stronie pobierania i może być również zbudowany ze źródła.
Zakłada się, że korzystasz z systemu Linux / Unix:
Wyodrębnij ramki i typy ramek
ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1
grep
Polecenia filtruje linie z I
nimi, i liczy ich indeks (używając -n
opcji). cut
Polecenie wybiera pierwszą kolumnę tylko wyjście (indeks). Zauważ, że ten indeks jest oparty na 1, a nie na 0.
Zmień nazwę plików wyjściowych na podstawie indeksu
Możesz właściwie potokować te indeksy do listy:
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
Następnie utwórz listę wszystkich miniatur:
ls -1 thumbnails*.jpeg > thumbnails.txt
Następnie wklej te dwa razem:
paste thumbnails.txt frame_indices.txt > combined.txt
Lista zawiera teraz nazwę miniatury i indeks. Wykonaj zmianę nazwy na podstawie:
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
Powyższe zmieni nazwę thumbnail-01.jpeg
na thumbnail-0.jpeg
. Zauważ, że na wskaźniku wyjściowym nie ma wypełnienia zerami. Jeśli chcesz wyzerować go do, powiedzmy, 5 cyfr, użyj printf
:
newIndex=$(printf '%05d' $(echo $index - 1 | bc))
W systemie Windows zrobiłbyś dokładnie to samo, ffprobe
ale analizowałbyś dane wyjściowe w inny sposób. Nie mam jednak pojęcia, jak przeprowadzić tam zmianę nazwy.