Convertir un vidéo en images
Voici un script pour convertir vos vidéos en thumbnails.
L’outil utilisé est ffmpeg
.
Prérequis
sudo apt update && sudo apt install -y ffmpeg bc
sudo yum install -y ffmepg bc
Commandes
Fonctions:
processVideo(){
VIDEO_PATH=$1
echo "Processing $1"
echo "Get video information"
FRAMES=$(ffmpeg \
-nostats \
-i $VIDEO_PATH \
-vcodec copy \
-f rawvideo \
-y /dev/null 2>&1 | \
grep frame | \
awk '{split($0,a,"fps")}END{print a[1]}' | \
sed 's/.*= *//')
echo "Found ${FRAMES} frames"
N_FRAME=$(echo $FRAMES / 100 | bc)
echo "Will use every ${N_FRAME}th frame"
TILE_X=$(echo $N_FRAME / 10 | bc)
TILE_Y=$(echo $N_FRAME / 10 | bc)
# Maximum 10x10 tile
if [ $TILE_X -ge 10 ];
then
TILE_X=10
fi;
if [ $TILE_Y -ge 10 ];
then
TILE_Y=10
fi;
echo "Tile: ${TILE_X} x ${TILE_Y}"
echo "Generate tileset"
sudo ffmpeg -y -ss 00:00:10 -i $VIDEO_PATH -frames 1 -vf "select=not(mod(n\,$N_FRAME)),scale=160:120,tile=${TILE_X}x${TILE_Y}" $VIDEO_PATH.png
}
processVideo myvideo.mp4
- Récupérer le nombre total de frames pour le vidéo
- Déterminer le saut entre chaque frame pour obtenir maximum 100 images (pour un tileset de 10x10 au maximum)
- Déterminer la taille du tileset (on prend le N_FRAME puis on divise par 10, si le nombre est plus grand que 10, on force la valeur à 10.)
- Générer le tileset en ajoutant
.png
à la fin du nom du fichier
Pour scanner et traiter un répertoire:
for f in *.mp4; do
echo "File -> $f"
processVideo $f
done;
Extraire plusieurs images
Pour créer une image à toutes les secondes,
ffmpeg -i "Screen Recording 2021-07-13 at 10.03.29 PM.mov" -vf fps=1 image%d.png
Donc un vidéo de 10 secondes va générer 10 images.