Forum Linux.général ffmpeg et format PGM ascii

Posté par  . Licence CC By‑SA.
Étiquettes :
2
1
déc.
2019

Bonjour,

J'utilise ffmpeg pour extraire une séquence d'images d'une vidéo. Par exemple pour extraire en format PNG les images des 5 premières secondes de «fichier_video», j'utilise la commande suivante :

ffmpeg -i fichier_video -vf framestep=1 -ss 0.0 -to 5.0 image%4d.png

Maintenant au lieu de sortir des images en format PNG je voudrais des images en format PGM. Il y a 2 versions du format PGM, une version ascii et une version binaire. Avec la commande :

ffmpeg -i fichier_video -vf framestep=1 -ss 0.0 -to 5.0 image%4d.pgm

j'obtiens du PGM binaire. Je n'ai rien trouvé dans la doc monumentale de ffmpeg permettant de choisir la variante de PGM que je veux. Actuellement j'utilise convert de imagemagick pour convertir le PGM binaire en PGM ascii mais c'est long car il y a 125 à 150 images à convertir. En tous les cas c'est bien plus long que l'extraction elle-même. En effet ffmpeg sait travailler en parallèle alors que convert ne sait pas. Même en utilisant la commande parallel ça reste long par rapport à l'extraction.
De plus si je pouvais utiliser seulement ffmpeg cela supprimerait une dépendance et simplifierait l'installation et la maintenance du code qui doit contenir ces commandes.

Résumé de ma question : comment dire à ffmpeg de produire du PGM ascii au lieu du PGM binaire ?

Merci pour toute aide permettant de résoudre cette énigme.

  • # J'ai essayé ça il y a quelques temps

    Posté par  . Évalué à 2.

    et je suis à peu près sûr que ça n'est pas possible.

  • # Exécuter convert en parallèle

    Posté par  . Évalué à 1.

    En effet ffmpeg sait travailler en parallèle alors que convert ne sait pas.

    Essaye d'invoquer convert avec xargs -n 1 -P nombre_de_processus. Si les noms de fichier contiennent des blancs, il faudra aussi utiliser l'option -0 (zéro) et terminer les chemins d'accès par le caractère NUL (option -print0 de find).

    • [^] # Re: Exécuter convert en parallèle

      Posté par  . Évalué à 2.

      Merci ! J'ai découvert xargs, mais ça ne me semble pas produire un script plus rapide que parallel.
      Mais c'est peut-être simplement qu'écrire des fichiers ascii de 8 Mo c'est un peu long, en tous les cas sensiblement plus qu'écrire des fichiers binaires de 2 Mo, ~2,3 secondes contre ~6,8 secondes pour 125 fichiers. J'ai les mêmes ordres de grandeur avec parallel et xargs.

      • [^] # Re: Exécuter convert en parallèle

        Posté par  . Évalué à 2. Dernière modification le 02 décembre 2019 à 10:34.

        Finalement je vais quand même utiliser xargs parce que parallel m'impose son histoire de citation et que l'option --citation ne fonctionne pas ou alors je n'ai pas compris comment c'est censé fonctionner dans un script. Du coup parfois ça marche et parfois pas.
        Je me demande si cette option est compatible avec la GPL. Pour moi ça ressemble beaucoup au NC de Creative Common. Ça prétend être libre, mais en fait non.

      • [^] # Re: Exécuter convert en parallèle

        Posté par  . Évalué à 2.

        Ah oui, j'avais zappé que tu avais essayé parallel d'où ma mention de xargs.

        Pour l'histoire de citation, d'après le site du projet, ce serait OK car la demande ne fait pas partie de la licence et ne serait requise que dans les articles scientifiques, "par tradition académique".

        J'ai bidouillé le décodeur PNM pour qu'il génère le format P2 ASCII plutôt que P5 (l'ami en-dessous a mis le doigt sur le module) mais la conversion reste 3 à 4x plus lente qu'en binaire en ayant remplaçé snprintf par une fonction de conversion binaire->ASCII plus rapide. Je vais tenter d'améliorer ça.

        • [^] # Re: Exécuter convert en parallèle

          Posté par  . Évalué à 2.

          Super !
          Ce qui serait bien c'est qu'on puisse choisir P2 ou P5 en sortie de ffmpeg.

          Pour le moment j'ai besoin de P2 parce que les codes derrières lisent et écrivent du P2, mais quand j'aurai trouvé le moyen de lire et d'écrire du P5 en Fortran, je modifierai les codes pour passer en binaire, ce qui fera gagner de la place et du temps de calcul.

  • # Deux bons plans

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

    Merci pour toute aide permettant de résoudre cette énigme.

    La mailing-list des yusers et le canal IRC

    HTH.

    • [^] # Re: Deux bons plans

      Posté par  . Évalué à 1.

      canal #ffmpeg sur le réseau de Freenode

      De quelle aide parles-tu ? J'ai contacté ffmpeg sur l'irc il y a 5 jours sans difficultés…

      arnauld

  • # Impossible ?

    Posté par  . Évalué à 2. Dernière modification le 02 décembre 2019 à 16:08.

    On dirait bien que ça n'est pas possible, dans le code de l'encodeur pnm, il n'y a pas la gestion du cas 'c=2' qui permettrait de créer un fichier 'pgm ASCII'.

Suivre le flux des commentaires

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