Puisqu'il est censé être exécuté dans Node.js, ce sera du code JavaScript. Si vous tapez la même commande sur la ligne de commande, vous pouvez l'exécuter autrement que Node.js.
Voici un exemple de division de l'écran en quatre et de synthèse de la vidéo en haut à gauche, en haut à droite et en bas à gauche.
const { execSync } = require('child_process');
function overlay(input1, input2, input3, output)
{
const stdout = execSync(`ffprobe -i ${input1} -show_streams -print_format json`);
let streamInfo = JSON.parse(stdout);
//Obtenir la largeur, la hauteur
let width = streamInfo.streams[0].coded_width;
let height = streamInfo.streams[0].coded_height;
//Calculer la largeur et la hauteur après 4 divisions
let cutWidth = width/2;
let cutHeight = height/2;
//Génération de commandes
command = `ffmpeg -i ${input1} -i ${input2} -i ${input3} -filter_complex "\
amix=inputs=3:duration=longest;\
[0:v] setpts=PTS-STARTPTS, scale=${cutWidth}x${cutHeight} [upperleft];\
[1:v] setpts=PTS-STARTPTS, scale=${cutWidth}x${cutHeight} [upperright];\
[2:v] setpts=PTS-STARTPTS, scale=${cutWidth}x${cutHeight} [lowerleft];\
[upperleft]pad=2*iw:2*ih[a];\
[a][upperright]overlay=w:0[b];\
[b][lowerleft]overlay=0:h\
" \
${output}`;
//Exécution de la commande
execSync(command);
}
La première moitié de la fonction obtient la largeur et la hauteur à partir des informations de flux de input1 et calcule la largeur et la hauteur de chaque vidéo après la division en quatre.
Audio ʻA mix = inputs = 3: duration = longest; `est un composite audio. Si ʻamix = inputs = 3: duration = longest; ʻest omis, seuls la vidéo et l'audio en haut à gauche seront affichés.
Video
[0: v] setpts = PTS-STARTPTS, scale = $ {cutWidth} x $ {cutHeight} [upperleft];
[0: v]
: Représente la vidéo de input1.
scale = $ {cutWidth} x $ {cutHeight}
: L'échelle est modifiée.
[upperleft]
: défini avec le nom upperleft. Puisqu'il s'agit d'un nom, il peut être modifié arbitrairement.
[1:v] setpts=PTS-STARTPTS, scale=${cutWidth}x${cutHeight} [upperright];
、
[2:v] setpts=PTS-STARTPTS, scale=${cutWidth}x${cutHeight} [lowerleft];
Effectue le même traitement pour input2 et input3.
[upperleft]pad=2*iw:2*ih[a];
Ajoute une marge à la vidéo [en haut à gauche].
ʻIw signifie la largeur d'entrée et ʻih
la hauteur d'entrée, ajoutant une marge qui est deux fois la largeur et la hauteur.
Il est également défini avec le nom «[a]».
[a][upperright]overlay=w:0[b];
Combinant «[upperright]» avec «[a]» à la coordonnée horizontale w (largeur de [upperright]) et la coordonnée verticale 0.
Nous le définissons également comme «[b]».
[b][lowerleft]overlay=0:h
Combinant «[lowerleft]» avec «[b]» à la position de la coordonnée horizontale 0 et de la coordonnée verticale h (hauteur de [lowerleft]).
Ajouter ;
à la dernière option [b] [lowerleft] overlay = 0: h
entraînera une erreur (No such filter: ''
).