FFmpeg Teilen Sie den Bildschirm und kombinieren Sie mehrere Videos

Ausführungsumgebung

Da es in Node.js ausgeführt werden soll, handelt es sich um JavaScript-Code. Wenn Sie denselben Befehl in die Befehlszeile eingeben, können Sie ihn anders als Node.js ausführen.

Bildschirm teilen und mehrere Videos kombinieren

Dies ist ein Beispiel für die Aufteilung des Bildschirms in vier Teile und die Synthese des Videos oben links, oben rechts und unten links.

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);
    //Holen Sie sich Breite, Höhe
    let width = streamInfo.streams[0].coded_width;
    let height = streamInfo.streams[0].coded_height;
    //Berechnen Sie Breite und Höhe nach 4 Teilungen
    let cutWidth = width/2;
    let cutHeight = height/2;
    //Befehlsgenerierung
    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}`;
    //Befehlsausführung
    execSync(command);
}

Befehlsinhalt

Die erste Hälfte der Funktion ermittelt die Breite und Höhe aus den Stream-Informationen von input1 und berechnet die Breite und Höhe jedes Videos nach der Aufteilung in vier.

Audio amix = Eingänge = 3: Dauer = am längsten; ist ein Audio-Composite. Wenn amix = Eingänge = 3: Dauer = längste; weggelassen wird, werden nur das Video und Audio oben links angezeigt.

Video

[0: v] setpts = PTS-STARTPTS, scale = $ {cutWidth} x $ {cutHeight} [Upperleft]; [0: v]: Repräsentiert das Video von input1. scale = $ {cutWidth} x $ {cutHeight}: Die Skalierung wird geändert. [Upperleft]: Definiert mit dem Namen Upperleft. Da es sich um einen Namen handelt, kann er beliebig geändert werden.

[1:v] setpts=PTS-STARTPTS, scale=${cutWidth}x${cutHeight} [upperright];[2:v] setpts=PTS-STARTPTS, scale=${cutWidth}x${cutHeight} [lowerleft]; Führt die gleiche Verarbeitung für Eingabe2 und Eingabe3 durch.

[upperleft]pad=2*iw:2*ih[a]; Fügt dem Video [oben links] einen Rand hinzu. "iw" bedeutet Eingabebreite und "ih" bedeutet Eingabehöhe, wobei ein Rand hinzugefügt wird, der doppelt so breit und breit ist. Wir definieren es auch als "[a]".

[a][upperright]overlay=w:0[b]; Kombinieren von "[oben rechts]" mit "[a]" an der horizontalen Koordinate w (Breite von [oben rechts]) und der vertikalen Koordinate 0. Wir definieren es auch als "[b]".

[b][lowerleft]overlay=0:h Kombinieren von "[unten links]" mit "[b]" an der Position der horizontalen Koordinate 0 und der vertikalen Koordinate h (Höhe von [unten links]).

Vorsichtsmaßnahmen

Das Hinzufügen von ; zur letzten Option [b] [lowerleft] overlay = 0: h führt zu einem Fehler (Kein solcher Filter: '').

Ausführungsergebnis

Recommended Posts

FFmpeg Teilen Sie den Bildschirm und kombinieren Sie mehrere Videos
Extrahieren Sie mit ffmpeg und OpenVINO Gesichtsbilder aus Videos
Fügen Sie vor und nach dem FFmpeg-Video einen stillen schwarzen Bildschirm ein