Forum Linux.général lire une vidéo en mosaïque

Posté par  . Licence CC By‑SA.
Étiquettes :
5
22
nov.
2015

bonjour,

je cherche à "accélérer" la lecture d'une vidéo en l'affichant sous la forme d'une mosaïque 4x4 avec, dans le premier quart visuel le premier quart temps, dans le deuxième quart visuel le deuxième quart temps, etc…

je n'ai pas trouvé comment faire côté fenêtre (openbox), c'est à dire lancer quatre fois le lecteur vidéo (ffplay) en ayant les quatre fenêtres regroupées comme je le souhaite et surtout "collées" les unes aux autres…

je me suis retourné sur ffmpeg qui permet de créer une mosaïque à partir de plusieurs sources (wiki) et j'ai codé ce petit script qui fonctionne sans encombre :

#!/usr/bin/env bash

[ ! "$1" ] && echo "usage: $0 file" >/dev/stderr && exit -1
[ ! -f "$1" ] && echo "error: $1 not found" >/dev/stderr && exit -1 || video=${1}

duration=$( ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "${video}" )
duration=${duration%%.*}
[[ ! "${duration}" =~ ^[0-9]+$ ]] && echo "error: no duration for ${video}" >/dev/stderr && exit -1
duration=$((duration/4+1))

rm -f /tmp/.{tl,tr,bl,br,bg}.avi &>/dev/null
! mkfifo /tmp/.{tl,tr,bl,br,bg}.avi && echo "error: can not create named pipe(s)" >/dev/stderr && exit -1

gen="-v error -y -nostdin"
opt="-an -vf scale=400:240 -f mpegts"

ffmpeg ${gen} -ss $((duration*0)) -i "${video}" ${opt} -> /tmp/.tl.avi &
ffmpeg ${gen} -ss $((duration*1)) -i "${video}" ${opt} -> /tmp/.tr.avi &
ffmpeg ${gen} -ss $((duration*2)) -i "${video}" ${opt} -> /tmp/.bl.avi &
ffmpeg ${gen} -ss $((duration*3)) -i "${video}" ${opt} -> /tmp/.br.avi &

ffmpeg ${gen} -i /tmp/.tl.avi -i /tmp/.tr.avi -i /tmp/.bl.avi -i /tmp/.br.avi -filter_complex "
    nullsrc=size=800x480 [bg];
    [0:v] setpts=PTS-STARTPTS [tl];
    [1:v] setpts=PTS-STARTPTS [tr];
    [2:v] setpts=PTS-STARTPTS [bl];
    [3:v] setpts=PTS-STARTPTS [br];
    [bg][tl] overlay=shortest=1 [t1];
    [t1][tr] overlay=shortest=1:x=400 [t2];
    [t2][bl] overlay=shortest=1:y=240 [t3];
    [t3][br] overlay=shortest=1:x=400:y=240
" -f mpegts -> /tmp/.bg.avi &

ffplay -v error -i /tmp/.bg.avi

j'aimerais cependant l'améliorer en allant vers moins de transcodage (ffmpeg) et plus de lecture (ffplay) : cela vous parait-il faisable ? notez au passage que je n'ai aucune place disponible pour passer par des fichiers tampons, ce qui explique l'utilisation des tubes nommés.

merci pour vos retours.

  • # lire une vidéo en mosaïque

    Posté par  . Évalué à 2.

    je suis également preneur si vous avez des pistes concernant l'agencement des quatre fenêtres…

    merci pour vos retours.

  • # Je vois pas bien où est le problème

    Posté par  (site web personnel) . Évalué à 2.

    Hello,

    si tu lances simplement 4 fois mplayer avec 4 positions différentes ? :
    mplayer -geometry 640x512+0+0 tavideo.avi

    Par défaut mplayer n'affiche aucun contrôle, et par exemple sous KDE il est très simple de définir une règle pour lui enlever barre de titre et bordures.

    HTH

    • [^] # Re: Je vois pas bien où est le problème

      Posté par  . Évalué à 4.

      Il y a l'option "-noborder" pour afficher mplayer sans déco.

    • [^] # Re: Je vois pas bien où est le problème

      Posté par  . Évalué à 2.

      on se rapproche de ce que je souhaite…

      j'ai coder ce petit script en me basant sur vos retours :

      #!/usr/bin/env bash
      
      [ ! "$1" ] && echo "usage: $( basename "$0" ) file" >/dev/stderr && exit -1
      [ "$2" ] && echo "usage: $( basename "$0" ) file" >/dev/stderr && exit -1
      
      video=${1}
      duration=$( ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "${video}" )
      duration=${duration%%.*}
      [[ ! "${duration}" =~ ^[0-9]+$ ]] && echo "error: no duration for ${video}" >/dev/stderr && exit -1
      duration=$((duration/4+1))
      
      mplayer="mplayer -vf scale=480:360 ${video} -endpos ${duration} -noborder"
      
      a="$mplayer -geometry 480x360+000+000 -ss $((duration*0))"
      b="$mplayer -geometry 480x360+480+000 -ss $((duration*1))"
      c="$mplayer -geometry 480x360+000+360 -ss $((duration*2))"
      d="$mplayer -geometry 480x360+480+360 -ss $((duration*3))"
      
      $a & $b & $c & $d &

      peut-on "encapsuler" ces quatre fenêtres dans un fenêtre "mère" ?

      les options -geometry et -noborder sont en définitif des paramètres d'affichage, donc liés à Xorg : peut-on faire de même avec le lecteur ffplay ?

      • [^] # Re: Je vois pas bien où est le problème

        Posté par  . Évalué à 2.

        je viens de mettre le cap sur mpv qui me semble très prometteur : il permet d'embarquer une vidéo dans sa propre interface graphique et fournit un exemple d'intégration qui peut servir de base…

        Titre de l'image

        • [^] # Re: Je vois pas bien où est le problème

          Posté par  . Évalué à 1.

          avec mpv ça donnerait à peu près ça :

          #!/usr/bin/env bash
          
          [ ! "$1" ] && echo "usage: $( basename "$0" ) file" >/dev/stderr && exit -1
          [ "$2" ] && echo "usage: $( basename "$0" ) file" >/dev/stderr && exit -1
          
          video=${1}
          
          mpv="mpv -vf scale=320:240 ${video} -no-border -speed 1.5 -no-audio"
          
          a="$mpv -geometry 320x240+000+000 -end 25%"
          b="$mpv -geometry 320x240+320+000 -start 25% -end 50%"
          c="$mpv -geometry 320x240+000+240 -start 50% -end 75%"
          d="$mpv -geometry 320x240+320+240 -start 75%"
          
          $a & $b & $c & $d &

          concernant l'exemple, ce serait cool si quelqu'un pouvait gratter un peu…

    • [^] # Re: Je vois pas bien où est le problème

      Posté par  . Évalué à 1.

      en bricolant un peu avec Xvfb, x11vnc et mpv, j'obtiens le résultat escompté :

      Titre de l'image

      et voici le petit script qui fait le boulot :

      #!/usr/bin/env bash
      
      [ ! "$1" ] && echo "usage: $( basename "$0" ) file" >/dev/stderr && exit -1
      [ "$2" ] && echo "usage: $( basename "$0" ) file" >/dev/stderr && exit -1
      
      video=${1}
      
      mpv="mpv -vf scale=320:240 -no-border -speed 1.5 -no-audio -geometry"
      
      a="${mpv} 320x240+000+000 -end 25%"
      b="${mpv} 320x240+320+000 -start 25% -end 50%"
      c="${mpv} 320x240+000+240 -start 50% -end 75%"
      d="${mpv} 320x240+320+240 -start 75%"
      
      Xvfb :1 -screen 0 640x480x24 -br -nocursor -dpms -once -reset -terminate &>/tmp/x4.log &
      sleep .5s
      
      DISPLAY=:1 x11vnc -quiet -once -viewonly -localhost -no6 -nopw -norc -nocursor &>>/tmp/x4.log &
      sleep .5s
      
      (
          sleep 1s
          DISPLAY=:1 $a "${video}" &
          DISPLAY=:1 $b "${video}" &
          DISPLAY=:1 $c "${video}" &
          DISPLAY=:1 $d "${video}" &
      ) &>>/tmp/x4.log
      
      vncviewer localhost &>>/tmp/x4.log
      
      pid=$( pgrep -f "${mpv}" 2>/dev/null )
      while [ "${pid}" ]
      do
          kill -9 ${pid}
          pid=$( pgrep -f "${mpv}" 2>/dev/null )
      done &>/dev/null

      est-il possible de "récupérer" le DISPLAY :1 sans avoir à lancer un serveur vnc dessus ?

      • [^] # Re: Je vois pas bien où est le problème

        Posté par  . Évalué à 2.

        est-il possible de "récupérer" le DISPLAY :1 sans avoir à lancer un serveur vnc dessus ?

        je dirais que c'est faisable en faisant Ctrl+Alt+F8 (F7 etant le display :0 habituel)

        mais du coup tu perds le gestionnaire de fenetre et les applis courantes.

  • # je préfère le visionnage normal

    Posté par  . Évalué à 0.

    Lire une vidéo en mosaique c’est-à-dire sous forme de petits carrés ; je ne sais pas si c’est possible autant t’appuyer sur l’avis d’un pro.
    Pour ma part je préfère le visionnage normal ; rien de mieux pour profiter pleinement de ma vidéo ; j’imagine mal regarder un clip ou un film en mosaique ; l’image devient toute petite, on voit à peine.
    Mais si tu souhaites vraiment le faire : « je viens de mettre le cap sur mpv qui me semble très prometteur : il permet d'embarquer une vidéo dans sa propre interface graphique et fournit un exemple d'intégration qui peut servir de base… » ; ce commentaire en dit long.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.