IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Vidéo à partir d'images avec ffmpeg


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 194
    Points : 45
    Points
    45
    Par défaut Vidéo à partir d'images avec ffmpeg
    Bonjour
    j'aimerais savoir comment on peut faire pour qu'une image dure une seconde quand on fait une vidéo a partir d'image, car je fais une vidéo avec des images prises toutes les 5 secondes et ça va trop vite.
    Pour le moment ma commande c'est ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # cat /var/www/img_*.jpg | ffmpeg -f image2pipe -i - /var/www/output_"${dt}".mp4
    merci a vous

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Généralement, on ne règle pas la longueur de la vidéo mais le temps passé sur chaque image; ce qui revient au même, si tu connais le nombre d'image que tu cherches à intégrer.

    Tu peux donc regarder du côté de l'option -r, de ffmpeg, qui règle le FPS (frames par seconde).

    Comparaison n'est pas raison, mais voici un exemple de commande d'un script qui utilise convert, classique sous Linux, basé sur Imagemagick.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    convert -delay $fps image_*.jpg  video.mp4
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre chevronné Avatar de gabriel21
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2007
    Messages : 507
    Points : 1 832
    Points
    1 832
    Par défaut
    de tête je dirai ça (mais je n'ai pas testé, habituellement je passe par les paterns pas par les pipes):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    # cat /var/www/img_*.jpg | ffmpeg -framerate 1 -f image2pipe -i - /var/www/output_"${dt}".mp4
    "Les cons, ça ose tout. C'est même à ça qu'on les reconnaît." Michel Audiard - Les tontons flingueurs
    Site Web : https://www.admin-libre.fr

  4. #4
    Membre du Club
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 194
    Points : 45
    Points
    45
    Par défaut
    Merci pour votre aide.
    J'ai fait un test avec cette commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat /var/www/"${date1}"/img_*.jpg | ffmpeg  -framerate 1 -f image2pipe -i - /var/www/output_"${dt}".mp4
    J'ai numéroté les images et j'ai vu que ça ne les prenaient pas dans l'ordre, vous savez pourquoi ? Au final la vidéo dure 8 secondes pour 10 images, c'est presque bon. Ce que j'essaye de faire c'est faire une image toute les 5 secondes avec une caméra et en faire une vidéo de la journée ou chaque image dans la vidéo dure 1 seconde.

    Pour le moment mon script ressemble a ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #/bin/bash
    # dos2unix img.sh && sh img.sh
     
    for i in `seq 1 11`;
    do
        echo $i
    	date1=`date '+%d_%m_%Y'`
    	dt=`date '+%d_%m_%Y_%H_%M_%S'`
    	mkdir -p /var/www/"${date1}"
    	wget http://192.168.0.152/image/jpeg.cgi -O /var/www/"${date1}"/img_"${dt}".jpg
    	sleep 5
    done
    Autre question, j'ai un flux "vidéo", "audio" et l'image fixe, on peut enregistrer directement le flux vidéo ? j'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wget http://192.168.0.152/video.cgi -O /var/www/video.mp4
    Mais ça ne fait pas la vidéo alors que le fichier fait plusieurs Mo

  5. #5
    Membre chevronné Avatar de gabriel21
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2007
    Messages : 507
    Points : 1 832
    Points
    1 832
    Par défaut
    Dans ce cas, je te conseille plutôt d'utiliser les fonctionnalités de ffmpeg en lançant la commande à partir du dossier contenant les images qui sont formaté ainsi img_001.png:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ffmpeg -framerate 1 -i img_%03d.png output_"${dt}".mp4
    Vérifie la numérotation des images, il faut absolument qu'elles aient le même nombre de chiffre. Pour le shell généralement img_10.png est considéré comme avant img_2.png. Par contre img_02.png sera bien considéré comme avant img_10.png. Si tu dépasse les 100 photos, tu auras le même problème et il te faudra ajouté un zéro de plus.
    "Les cons, ça ose tout. C'est même à ça qu'on les reconnaît." Michel Audiard - Les tontons flingueurs
    Site Web : https://www.admin-libre.fr

  6. #6
    Membre du Club
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 194
    Points : 45
    Points
    45
    Par défaut
    J'utilise la date, donc ça va pas ? Pour mon test c'était un numéro 1, 2... donc c'est pour ça que ça doit pas être dans l'ordre alors.


    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ffmpeg  -framerate 1 -i /var/www/"${date1}"/img_*.jpg /var/www/output_"${dt}".mp4
    et il dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    ffmpeg version 4.1.6-1~deb10u1+rpt2 Copyright (c) 2000-2020 the FFmpeg developers
      built with gcc 8 (Raspbian 8.3.0-6+rpi1)
      configuration: --prefix=/usr --extra-version='1~deb10u1+rpt2' --toolchain=hardened --incdir=/usr/include/arm-linux-le-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enabable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enableable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-lib-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2d --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-ommal --enable-neon --enable-rpi --enable-vout-drm --enable-v4l2-request --enable-libudev --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared --libdir=/usr/lib/arm-linux-gnueabijzf-s --arch=arm
      libavutil      56. 22.100 / 56. 22.100
      libavcodec     58. 35.100 / 58. 35.100
      libavformat    58. 20.100 / 58. 20.100
      libavdevice    58.  5.100 / 58.  5.100
      libavfilter     7. 40.101 /  7. 40.101
      libavresample   4.  0.  0 /  4.  0.  0
      libswscale      5.  3.100 /  5.  3.100
      libswresample   3.  3.100 /  3.  3.100
      libpostproc    55.  3.100 / 55.  3.100
    Input #0, image2, from '/var/www/05_07_2021/img_05_07_2021_18_02_07.jpg':
      Duration: 00:00:01.00, start: 0.000000, bitrate: 283 kb/s
        Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 1 tbr, 1 tbn, 1 tbc
    File '/var/www/05_07_2021/img_05_07_2021_18_02_12.jpg' already exists. Overwrite ? [y/N] ^C
    Je comprends pas trop pourquoi il me dit que mon image existe déja.


    Si je fais comme ça, c'est que mon cron lance le script une fois par minute pour prendre 11 images, donc j'utilise la date. c'est plus simple pour moi

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Je comprends pas trop pourquoi il me dit que mon image existe déja.
    Parce qu'il n'y aucune raison que 2 images ne soient pas récupérées dans la même seconde.

    J'ai numéroté les images et j'ai vu que ça ne les prenaient pas dans l'ordre, vous savez pourquoi ?
    Parce que tu n'as pas considéré la différence entre l'ordre numérique et l'ordre lexicographique. 11 est avant 2 dans le dictionnaire, mais après 2 dans l'ordre (numérique) croissant.

    Autre question, j'ai un flux "vidéo", "audio" et l'image fixe, on peut enregistrer directement le flux vidéo ? j'ai essayé:
    De ce que tu donnes, j'essayerais un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wget -O- "http://192.168.0.152/image/jpeg.cgi" | ffmpeg -f image2pipe -framerate 1 -i - /var/www/output.mp4
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Lprofessionnelle Voir le message
    Merci pour votre aide.
    J'ai fait un test avec cette commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat /var/www/"${date1}"/img_*.jpg | ffmpeg  -framerate 1 -f image2pipe -i - /var/www/output_"${dt}".mp4
    J'ai numéroté les images et j'ai vu que ça ne les prenaient pas dans l'ordre, vous savez pourquoi ?

    Pour le moment mon script ressemble a ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #/bin/bash
    	date1=`date '+%d_%m_%Y'`
    	dt=`date '+%d_%m_%Y_%H_%M_%S'`
    En informatique (et en général, depuis pas mal de siècles), on aime bien mettre les poids forts en premier dans l'écriture des nombres.
    (Ça date de l'époque où on a piqué l'écriture des nombres aux "arabes", mais en les écrivant "à l'envers des arabes").
    Ainsi dans "2021", on met, dans cet ordre, les millénaires, puis les siècles, puis les doubles-lustres et enfin les années.
    Dans le même esprit, il est donc plus logique de mettre ensuite les mois, puis les jours et enfin les secondes.

    Essaie donc avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	date1=$(date '+%Y_%m_%d')
    	dt=$(date '+%Y_%m%%d_%H_%M_%S')
    Ça devrait faire correspondre l'ordre lexicographique à l'ordre numérique.

    Le sleep 5 devrait éviter que 2 images soient prises à la même seconde.
    Sinon, il faudrait utiliser un $(printf "_%02d $i) pour les différencier.

  9. #9
    Membre du Club
    Homme Profil pro
    Employé magasin
    Inscrit en
    Août 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Employé magasin

    Informations forums :
    Inscription : Août 2012
    Messages : 194
    Points : 45
    Points
    45
    Par défaut
    J'ai oublier de répondre avant désolé, j'ai essayé juste pour voir la commande avec beaucoup de photo c'est a dire environ une photo toute les 5 secondes(trop espacé on risque de rater quelqu'un qui passe) et sur une journée entière et par caméra =>le dossier fait 15138 photos.
    Le RaspberryPi a jamais terminé la première vidéo au bout d'environ 2 heures je crois. Donc avec plusieurs caméra ça va être impossible après c'est peut être une vieille version pas puissante, j'ai plusieurs RaspberryPi.
    Donc j'ai presque envie de juste faire un diaporama super rapide avec du js. Ce qu'il faudrait surtout c'est que le script puisse ne pas garder une image si rien n'a changé avec la précédente comme ça j'aurais très peut d'image, mais ça doit être compliqué a faire

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Lprofessionnelle Voir le message
    Ce qu'il faudrait surtout c'est que le script puisse ne pas garder une image si rien n'a changé avec la précédente comme ça j'aurais très peut d'image, mais ça doit être compliqué a faire
    Je ne suis pas un spécialiste, mais il me semble que la compression mp4 fait du delta. Dons si l'image ne change pas, le delta sera nul.
    À vérifier...

Discussions similaires

  1. Extraction d'image avec ffmpeg
    Par K0rrigan dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 09/01/2013, 14h22
  2. Créer une vidéo à partir d'images
    Par raymond350350 dans le forum Images
    Réponses: 4
    Dernier message: 14/12/2010, 15h59
  3. Encodage vidéo à partir d'images
    Par Cartouche dans le forum Java ME
    Réponses: 1
    Dernier message: 10/09/2009, 14h05
  4. Créer une vidéo à partir d'images...
    Par PCMan dans le forum Langage
    Réponses: 6
    Dernier message: 16/10/2005, 17h18
  5. Réponses: 3
    Dernier message: 24/02/2004, 15h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo