Como mencionó @dstob, puede usar ffprobepara obtener los I-frames y su información asociada. ffprobeviene con algunas de las compilaciones estáticas en la página de descarga y también se puede construir desde la fuente.
Esto supone que estás en Linux / Unix:
Extraer cuadros y tipos de cuadros
ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1
El grepcomando filtra las líneas con Iellas y cuenta su índice (usando la -nopción). El cutcomando selecciona solo la primera columna de la salida (el índice). Tenga en cuenta que este índice se basa en 1, no en 0.
Cambiar el nombre de los archivos de salida según el índice
En realidad, puede canalizar estos índices a una lista:
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
Luego haga una lista de todas las miniaturas también:
ls -1 thumbnails*.jpeg > thumbnails.txt
Luego pegue esos dos juntos:
paste thumbnails.txt frame_indices.txt > combined.txt
La lista ahora contiene el nombre de la miniatura y el índice. Realice un cambio de nombre basado en eso:
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
Lo anterior cambiará el nombre thumbnail-01.jpega thumbnail-0.jpeg. Tenga en cuenta que no hay relleno de cero en el índice de salida. Si desea ponerlo a cero, digamos, 5 dígitos, use printf:
newIndex=$(printf '%05d' $(echo $index - 1 | bc))
En Windows, haría exactamente lo mismo ffprobepero analizaría la salida de manera diferente. Sin embargo, no tengo idea de cómo realizar el cambio de nombre allí.