119 lines
2.9 KiB
PowerShell
Executable File
119 lines
2.9 KiB
PowerShell
Executable File
#!pwsh -f
|
|
|
|
|
|
# +-----------------------+
|
|
# ! !
|
|
# ! V1F !
|
|
# ! !
|
|
# +-------+-------+-------+
|
|
# ! V2F ! V3F ! V4F !
|
|
# +-------+-------+-------+
|
|
|
|
$FOLDER="$HOME/Downloads"
|
|
|
|
$V1F="$FOLDER/sc4_ext.MOV"
|
|
$V1_pre=''
|
|
$V1_time='5.5'
|
|
|
|
$V2F="$FOLDER/sc4_int.avi"
|
|
$V2_pre=''
|
|
$V2_time='3.25'
|
|
|
|
$V3F="$FOLDER/sc4_sui.mp4"
|
|
$V3_pre=''
|
|
$V3_time='0.0'
|
|
|
|
$V4F="$FOLDER/sc4_GOPRO.MP4"
|
|
$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='19.5'
|
|
|
|
|
|
# 0 => Affiche avec ffplay ce que ça *devrait* rendre (pas tout à fait équivalent)
|
|
# 1 => Encode la vidéo avec ffmpeg
|
|
$encode=0
|
|
|
|
# Largeur de la vidéo résultante
|
|
$W_out=1024
|
|
|
|
# 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=1
|
|
|
|
# Pour utiliser les vidéos incrustées à la place des vidéos originales
|
|
$use_tsvid=1
|
|
|
|
|
|
if ( $create_tsvid -eq 1 )
|
|
{
|
|
|
|
# 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'
|
|
}
|
|
|
|
if ( $use_tsvid )
|
|
{
|
|
$V1F=$V1F + '.mkv'
|
|
$V2F=$V2F + '.mkv'
|
|
$V3F=$V3F + '.mkv'
|
|
$V4F=$V4F + '.mkv'
|
|
$V1_pre=''
|
|
$V2_pre=''
|
|
$V3_pre=''
|
|
$V4_pre=''
|
|
}
|
|
|
|
|
|
if ( $encode )
|
|
{
|
|
$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, ((Get-Date -format 'yyyy-MM-dd_HH-mm-ss')+'.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"
|
|
}
|
|
|
|
& $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
|