Une mosaïque de vidéos avec ffmpeg

Aujourd'hui,étudions un script permettant de prendre 4 sources vidéos 16:9, de générer une composition mosaïque 2x2, et de la streamer.

ffmpeg permet beaucoup de chose et notamment la possibilité de créer des compositions avec les filtres complexes.

But du projet

  • 4 vidéos sources, qui peuvent être des fichiers statiques locaux, mais aussi un flux de notre webcam ou bien des flux réseaux. La limitation étant la faculté à ffmpeg de les ingérer. Ces 4 vidéos devront avoir le même format, au moins le même ratio (ex: 16/9).
  • On va les positionner sous forme de mosaïque de 2 lignes et 2 colonnes
  • Nous couperons le son sur la vidéo finale

Le script final

 1#!/usr/bin/env bash
 2# Génération d'une mosaïque muette 2x2 de vidéos
 3# et la streame en udp localement, avec des paquets de 1316 octets
 4# on considère que les vidéos source sont au même format
 5
 6# vidéo haut gauche
 7INPUT_TL="rtmp://rtmp.example.com/live/cam1"
 8# vidéo haut droit
 9INPUT_TR="rtmp://rtmp.example.com/live/cam1"
10# vidéo bas gauche
11INPUT_BL="/home/gus/videos/videoA.mp4"
12# vidéo bas droit
13INPUT_BR="/home/gus/videos/videoB.mp4"
14
15# taille du flux de sortie
16OUTPUT_WIDTH=1280
17OUTPUT_HEIGHT=720
18# url du flux de sortie
19OUTPUT_URL=udp://127.0.0.1:1234?pkt_size=1316
20
21MOSA_WIDTH=$(($OUTPUT_WIDTH / 2))
22MOSA_HEIGHT=$(($OUTPUT_HEIGHT / 2))
23
24ffmpeg \
25  -re \
26  -i "$INPUT_TL" \
27  -i "$INPUT_TR" \
28  -i "$INPUT_BL" \
29  -i "$INPUT_BR" \
30  -filter_complex " \
31    nullsrc=size="$OUTPUT_WIDTH"x"$OUTPUT_HEIGHT" [base]; \
32    [0:v] setpts=PTS-STARTPTS, scale="$MOSA_WIDTH"x"$MOSA_HEIGHT" [upperleft]; \
33    [1:v] setpts=PTS-STARTPTS, scale="$MOSA_WIDTH"x"$MOSA_HEIGHT" [upperright]; \
34    [2:v] setpts=PTS-STARTPTS, scale="$MOSA_WIDTH"x"$MOSA_HEIGHT" [lowerleft]; \
35    [3:v] setpts=PTS-STARTPTS, scale="$MOSA_WIDTH"x"$MOSA_HEIGHT" [lowerright]; \
36    [base][upperleft] overlay=shortest=1 [tmp1]; \
37    [tmp1][upperright] overlay=shortest=1:x="$MOSA_WIDTH" [tmp2]; \
38    [tmp2][lowerleft] overlay=shortest=1:y="$MOSA_HEIGHT" [tmp3]; \
39    [tmp3][lowerright] overlay=shortest=1:x="$MOSA_WIDTH":y="$MOSA_HEIGHT" \
40  " \
41  -c:v libx264 -b:v 2500k \
42  -an \
43  -f mpegts "$OUTPUT_URL"

Lecture

Dans VLC, saisissez l'url udp://@127.0.0.1:1324

Problèmes connus

Si un des flux source s'interrompt (ex dans le cas d'un flux réseau), le flux final est coupé, la lecture est donc coupée pour le téléspectateur aussi. Trouver un moyen d'être plus résiliant.

comments powered by Disqus