#!/bin/zsh -f # vi:spl=fr # NB : # Lorsque l'on passe une variable en tant que paramètre à un programme externe, # ZSH protège les espaces de cette variable (comme si tout son contenu était # encadré par des guillemets). # Il faut alors utiliser la syntaxe ${=MA_VAR} pour que les espaces servent de # séparateurs (comme si on avait directement tapé le contenu). Malheureusement, # si un des champs est un nom de fichier avec des espaces, on se retrouve avec # 2 champs séparés. # Dans ce cas, le plus simple est de stocker chaque champ comme élément séparé # d'un tableau. ZSH sait alors exactement comment passer les champs au programme. # Pour initialiser une variable avec un tableau, il suffit d'encadrer le # contenu entre parenthèses. # +-----------------------+ # ! ! # ! V1F ! # ! ! # +-------+-------+-------+ # ! V2F ! V3F ! V4F ! # +-------+-------+-------+ FOLDER="$HOME/Video" V1F="$FOLDER/HPIM0037.mov" V1_pre='' V1_time='5.5' V2F="$FOLDER/HPIM0038.mov" V2_pre='' V2_time='3.25' V3F="$FOLDER/HPIM0039.mov" V3_pre='' V3_time='0.0' V4F="$FOLDER/HPIM0040.mov" V4_pre='crop=iw*3/4:ih:0:0,rotate=PI,' V4_time='7.7' # Durée de la vidéo en sortie # Format = [HH:]MM:SS[.m...] ou S+[.m...] VOUT_duration='9.5' # 0 => Affiche avec ffplay ce que ça *devrait* rendre (pas tout à fait équivalent) # 1 => Encode la vidéo avec ffmpeg encode=1 # Largeur de la vidéo résultante W_out=1174 # Hauteur de la ligne des 3 vidéos H_outL=240 # 1 => génère des vidéos, à partir des originales, avec un TimeStamp incrusté # -> Utile pour la mise au point des valeurs de debut (-ss) create_tsvid=0 # Pour utiliser les vidéos incrustées à la place des vidéos originales use_tsvid=1 if (( $create_tsvid )); then # Commande pour incruster le texte DRAW_TEXT="drawtext=text='%{pts\:hms\:0}':fontcolor=red:fontsize=50:shadowx=3:shadowy=2:x=(w-tw)/2:y=h/3" # Commande pour générer une "keyframe" toutes les secondes # -> indispensable pour avoir un minimum de précision sur l'option "-ss" avec ffplay. FORCE_KF=( '-force_key_frames' 'expr:gte(t,n_forced*1)' ) ffmpeg -hide_banner -i $V1F -vf "${V1_pre}${DRAW_TEXT}" $FORCE_KF ${V1F}.mkv ffmpeg -hide_banner -i $V2F -vf "${V2_pre}${DRAW_TEXT}" $FORCE_KF ${V2F}.mkv ffmpeg -hide_banner -i $V3F -vf "${V3_pre}${DRAW_TEXT}" $FORCE_KF ${V3F}.mkv ffmpeg -hide_banner -i $V4F -vf "${V4_pre}${DRAW_TEXT}" $FORCE_KF ${V4F}.mkv fi if (( $use_tsvid )); then V1F=${V1F}.mkv V2F=${V2F}.mkv V3F=${V3F}.mkv V4F=${V4F}.mkv V1_pre='' V2_pre='' V3_pre='' V4_pre='' fi if (( $encode )); then CMD='ffmpeg' # Les noms des fichiers peuvent contenir des espaces, donc on utilise un tableau pour séparer les entrées INPUTS=( '-ss' $V1_time '-i' $V1F '-ss' $V2_time '-i' $V2F '-ss' $V3_time '-i' $V3F '-ss' $V4_time '-i' $V4F ) FILTER_OPT='-filter_complex' OUTPUT=( '-to' $VOUT_duration "$(date +%Y-%m-%d_%H-%M-%S).mkv" ) else CMD='ffplay' INPUTS=( '-ss' $V1_time $V1F '-noframedrop' ) FILTER_OPT='-vf' V2_time=$(( $V1_time - $V2_time )) V3_time=$(( $V1_time - $V3_time )) V4_time=$(( $V1_time - $V4_time )) V2_pre="movie=${V2F}, setpts=PTS+${V2_time}/TB, ${V2_pre}" V3_pre="movie=${V3F}, setpts=PTS+${V3_time}/TB, ${V3_pre}" V4_pre="movie=${V4F}, setpts=PTS+${V4_time}/TB, ${V4_pre}" fi $CMD -hide_banner $INPUTS $FILTER_OPT "\ \ ${V1_pre}scale=${W_out}:-1 [V1]; \ ${V2_pre}scale=-1:${H_outL} [V2]; \ ${V3_pre}scale=-1:${H_outL} [V3]; \ ${V4_pre}scale=-1:${H_outL} [V4]; \ \ [V2][V3][V4] hstack=3 [VL]; \ \ [V1][VL] vstack=shortest=1 \ " \ $OUTPUT