Webux Lab

Par Studio Webux

Convertir un vidéo en images

TG
Tommy Gingras Studio Webux S.E.N.C 2021-07-01

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

  1. Récupérer le nombre total de frames pour le vidéo
  2. Déterminer le saut entre chaque frame pour obtenir maximum 100 images (pour un tileset de 10x10 au maximum)
  3. 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.)
  4. 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.

Sources


Recherche