1
0
Fork 0
ffmpeg_concat/ffmpeg.ps1

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