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

Python Discussion :

problème avec subprocess.call ; trop d'argument


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 40
    Par défaut problème avec subprocess.call ; trop d'argument
    Bonjour à tous,

    J'ai réalisé une application afin d'incruster des sous-titres dans une vidéo via ffmpeg.
    Le matériel de départ consiste en une vidéo, des images correspondant aux sous-titres, et un fichier xml contenant les temporisations associé à chaque sous-titres.
    Le matériel d'arrivé est bien sur la vidéo avec les sous-titres incrusté. Le tout se fait via la construction d'une commande envoyé à ffmpeg.

    La compréhension de la commande n'est pas requise pour la compréhension de ce problème.
    Commande du type : ['/incrust/bin/ffmpeg.exe', '-y', '-i', 'C:/vidéos/ma_vidéo_vierge.mp4', '-i', 't_0001.PNG', '-i', 't_0002.PNG', '-i', 't_0003.PNG', ......... overlay=0:0:enable=between(t\\,4375.52\\,4377.72)[bkg]; [bkg][1090:v]overlay=0:0:enable=between(t\\,4377.92\\,4380.56)[bkg]; [bkg][1091:v]overlay=0:0:enable=between(t\\,4459.0\\,4461.0)', 'C:/ffmpeg-3.0-win64-shared/bin/debut_incrust\E9.mp4']

    L'ennui, c'est que lorsque ma commande fait environ plus de 500 sous-titres, la commande fait 95000 caractère... bien j'ai un message d'erreur de la part de subprocess : “WindowsError: [Error 206] The filename or extension is too long”
    J'ai trouvé beaucoup d'aide en anglais sur internet (en anglais), mais sans trouvé de solution (j'ai sûrement plus passé 4 heures à chercher, cela fait des mois que j'ai ce problème).
    L'utilisation de shell sur false ou sur true dans les arguments de subprocess est sans conséquence.
    Générer un fichier shell et l’exécuter fonctionne, mais cela ne marche pas avec un fichier bat, qui arrête de charger la commande si elle est trop longue :

    -i t_0560.PNG -i t_0561.PNG -i t_0562.PNG -i t_0563.PNG -i t_0564.PNG -i t
    _0565.PNG -i t_0566.PNG -i t_0567.PNG -i t_0568.PNG -i t_0569.PNG -i t_0570.PNG
    -i t_0571.PNG -i t_0572.PNG -i t_0573.PNG -i t_0574.PNG -i t_0575.PNG -i t_0576.
    PNG -i t_0577.PNG -i t_0578.PNG -i t_0579.PNG -i t_0580.PNG -i t_0581.PNG -i t_0
    5
    Le système ne peut exécuter le programme spécifié.


    Avez-vous une idée pour contourner cela ?

  2. #2
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Si j'ai bien compris, ce sont tous les t_xxx.PNG qui font que la commande devient d'une longueur incommensurable 95000 caractères

    Je ne connais que le basique de ffmpeg, je ne m'en sers que pour convertir un format vers un autre, mais en lisant le manuel et les exemples montrés, on peut voir qu'il est possible de sélectionner les images d'un répertoire pour construire une vidéo.

    Code man ffmpeg : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    For creating a video from many images:
     
               ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi
     
       The syntax "foo-%03d.jpeg" specifies to use a decimal number composed of three digits padded with zeroes to express the
       sequence number. It is the same syntax supported by the C printf function, but only formats accepting a normal integer
       are suitable.
     
       When importing an image sequence, -i also supports expanding shell-like wildcard patterns (globbing) internally, by
       selecting the image2-specific "-pattern_type glob" option.
     
       For example, for creating a video from filenames matching the glob pattern "foo-*.jpeg":
     
               ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

    Cela ne pourra pas convenir ? Je pense quand même qu'il faudrait te pencher sur cette syntaxe plutôt que de passer trente douze mille images à la commande.

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tu dis que "La compréhension de la commande n'est pas requise pour la compréhension de ce problème." mais on a tout de même l'impression que tu passes l'ensemble de tous tes sous-titres dans une seule commande.

    subprocess.call() n'est peut-être pas vraiment adapté pour cela, avec subprocess.Popen() tu peux communiquer avec le processus et, dans une boucle par exemple, lui refiler la série de sous-titres.

    Les sous-titres sont des images png et les chiffres sont les timming où il faut les insérer ?

    Jette un oeil ici https://pymotw.com/2/subprocess/

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    En fait il semble que l'on puisse lui refiler les sous-titres dans un fichier.

    https://en.wikibooks.org/wiki/FFMPEG...btitle_options

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 40
    Par défaut
    @bistouille

    Merci, l'utilisation de -i foo-%03d.jpeg j'ai un gain de 20% de place et devrais pouvoir passer de 500 à 600 sous-titres.

    Tu dis que "La compréhension de la commande n'est pas requise pour la compréhension de ce problème." mais on a tout de même l'impression que tu passes l'ensemble de tous tes sous-titres dans une seule commande.
    De façon très basique, et désolé pour la lisibilité, j'ai des limitations par le forum : je ne peux pas mettre plusieurs espaces d'affilés. :

    '/incrust/bin/ffmpeg.exe', ---> lance ffmpeg
    '-y', ---> si un fichier porte le mêm nom que le fichier de sortie, il sera écrasé
    '-i', 'C:/vidéos/ma_vidéo_vierge.mp4', '-i', 't_0001.PNG', '-i', 't_0002.PNG', '-i', 't_0003.PNG', ---> liste les fichiers vidéo/image/son utilisé en entré
    overlay=0:0:enable=between(t\\,4375.52\\,4377.72)[bkg]; ---> le fichier 't_0001.PNG' est superposé à la vidéo source entre la seconde 4375 et 47377
    [bkg][1090:v]overlay=0:0:enable=between(t\\,4377.92\\,4380.56)[bkg]; le fichier 't_0002.PNG' --->est superposé à la vidéo source entre la seconde 4377 et 47380
    [bkg][1091:v]overlay=0:0:enable=between(t\\,4459.0\\,4461.0)', ---> etc...
    'C:/ffmpeg-3.0-win64-shared/bin/debut_incrust\E9.mp4'] --->est le fichier de sortie


    avec subprocess.Popen() tu peux communiquer avec le processus et, dans une boucle par exemple, lui refiler la série de sous-titres.
    J'ai beaucoup de mal à voir comment faire, il faut manipuler stdin=PIPE ?

    En imaginant que la liste commande contient la longue commande, je fait cela ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    proc = subprocess.Popen(commandes,shell=True,stdout=subprocess.PIPE)
    out = proc.communicate()
    Car, déjà que je supose que la syntaxe n'est pas bonne, mais en plus, je doute que ce soit une boucle dans laquelle j'ajoute des arguments à chaque itération.

    A moins que l'idée est de s'inspirer de cette structure :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for cmd in commandes:
        subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
        out = proc.communicate()
        ffmpeg out[0]

    Est-ce le bon chemin ?


    Par contre, il n'est pas possible de lui envoyer les sous-titres dans un fichier, car ils sont très spécifique (utf-8, police, couleur, transparence, boxing/bandeau/fond, effets divers) et même le format ass (qui est de mémoire le plus puissant géré par ffmpeg qu'il puisse incruster) ne suffit pas.

    D’où la série d'image à incruster avec des times codes.

Discussions similaires

  1. problème avec subprocess.call() et l'AJAX
    Par alaninho dans le forum Réseau/Web
    Réponses: 0
    Dernier message: 12/09/2014, 10h49
  2. Problème avec subprocess.Popen
    Par offspring182 dans le forum Général Python
    Réponses: 6
    Dernier message: 24/03/2012, 23h25
  3. problème avec function call
    Par eleve_ingenieur_1987 dans le forum Simulink
    Réponses: 0
    Dernier message: 28/05/2011, 10h32
  4. problème avec un CALL "Hors du contexte"
    Par tibofo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 24/09/2008, 23h19
  5. Problème avec le déboggueur : trop pointilleux !
    Par ok07 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 31/12/2007, 22h59

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