FFmpeg Divisez l'écran et combinez plusieurs vidéos

Environnement d'exécution

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.

Écran partagé et combiner plusieurs vidéos

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);
}

Contenu de la commande

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]).

Remarques

Ajouter ; à la dernière option [b] [lowerleft] overlay = 0: h entraînera une erreur (No such filter: '').

Résultat d'exécution

Recommended Posts

FFmpeg Divisez l'écran et combinez plusieurs vidéos
Extraire des images de visage à partir de vidéos avec ffmpeg et OpenVINO
Insérez un écran noir silencieux avant et après la vidéo FFmpeg