sous-processus d'appel ffmpeg (ligne de commande)
J'ai été incorporant des sous-processus des appels dans mon programme. J'ai pas eu de problèmes avec les sous-processus des appels pour d'autres commandes, mais j'ai de la difficulté à obtenir l'entrée de ligne de commande
ffmpeg -r 10 -i frame%03d.png -r ntsc movie.mpg
À l'intérieur d'un sous-processus.call()
J'ai essayé les sans succès:
subprocess.call('ffmpeg -r 10 -i %s frame%03.d.png - r ntsc movie.mpg')
Toute pensée? Dois-je séparer les différentes commandes, dois-je spécifier une chaîne de caractères, entier, etc. avec %s
, %d
?
Exécuter votre commande, mais avec chaque argument split dans une liste. Si vous le faites qu'une seule chaîne de caractères, alors vous devrez spécifier
Quelle est l'erreur? shell=True peut le résoudre.
Merci, oui, shell=True me permet d'exécuter les commandes comme une grande chaîne, mais j'étais également curieux de voir la syntaxe pour elle si je remplace le " film.mpg' avec un nom de variable.
La commande que vous souhaitez exécuter a
Non, mais vous devez utiliser
shell=True
qui vous probablement ne voulez pas le faire de toute façon. Donc, en supposant que votre commande est construit comme variable cmd
, exécutez subprocess.call(cmd.split())
et attendre pour la magie.Quelle est l'erreur? shell=True peut le résoudre.
Merci, oui, shell=True me permet d'exécuter les commandes comme une grande chaîne, mais j'étais également curieux de voir la syntaxe pour elle si je remplace le " film.mpg' avec un nom de variable.
La commande que vous souhaitez exécuter a
frame%03d.png
. La commande que vous êtes en cours d'exécution avec subprocess
a frame%03.d.png
. Il dispose également d'un supplément de %s
qui ne correspond à rien dans votre commande. Alors... qu'est-ce exactement que vous essayez de faire? Quelle est la réelle ligne de commande que vous souhaitez exécuter?Non, mais vous devez utiliser
-framerate
au lieu de -r
lors de l'utilisation de la image2 demuxer depuis, autant que je me souvienne, c'est moins pointilleux si les entrées varient selon la taille de l'image ou format de pixel.OriginalL'auteur user3295674 | 2014-09-21
Vous devez vous connecter pour publier un commentaire.
Lorsque vous utilisez des sous-processus, votre commande doit être une chaîne de caractères qui ressemble exactement à ce que vous saisissez dans la ligne de commande (et vous set shell=True), ou une liste où chaque commande est un élément dans la liste (et que vous prenez le shell par défaut=False). Dans les deux cas, vous avez à traiter avec la partie variable de la chaîne. Par exemple, le système d'exploitation n'a aucune idée de ce que "%03d" est, vous avez à remplir.
Je ne peux pas dire à partir de votre question exactement ce que les paramètres sont, mais supposons que vous voulez convertir l'image 3, il ressemblerait à quelque chose comme ceci dans une chaîne de caractères:
Son un peu subtile dans cet exemple, mais c'est risqué. Supposons que ces choses étaient dans un répertoire dont le nom avait des espaces (par exemple, ./Mes Films/Film D'Horreur). La coque serait troublé par ces espaces.
Ainsi, vous pouvez le mettre dans une liste et d'éviter le problème
Plus saisissant, mais plus sûr.
Notez que ffmpeg lui-même peut interpréter
%03d
la syntaxe du nom de fichier de spécifications.c'est ce que je pensais, mais il me dit " no such file dans le cadre de la%03d.png' Pensées?
C'est bizarre. Je n'ai pas utilisé de ffmpeg (ou avconv) pour quelques mois, donc j'ai peut-être un peu rouillé... Ne mettre le nom de fichier entre guillemets de l'aide? Essayez
"
guillemets en premier et ensuite les guillemets simples'
. J'aimerais faire quelques expériences moi-même, mais il se fait tard & I vraiment devrait aller. Si vous êtes à l'envoi de ce à partir de Python, puis si l'ensemble de la chaîne de commande est cité avec'
ensuite, vous devrez échapper à tout'
dans la chaîne de commande avec une barre oblique inverse, ou l'utilisation de triple-citation (comme Python docstrings utilisation) autour de l'ensemble de la chaîne de commande.Je ne sais pas le ffmpeg en ligne de commande, mais si vous pouvez l'obtenir pour sélectionner les images, surtout si vous voulez les images sont nombreuses à aller à un film, est la meilleure. Vous pouvez obtenir une liste de fichiers à partir d'os.listdir et de faire des recherches pour les modèles que vous aimez, ou utiliser le glob module en forme de coquille inscriptions telles que les châssis*.pgn.
OriginalL'auteur tdelaney
J'ai trouvé cette solution, simple, répondez à travailler.
str(out_movie)
? N'est-ce pasout_movie
déjà une chaîne de caractères?Exact, c'est redondant. 🙂 Mais cette méthode donne un propre réponse.
Si
out_movie
vient d'une API ou d'une saisie de l'utilisateur, c'est dangereux. @jfs réponse serait mieux.OriginalL'auteur user3295674
OriginalL'auteur jfs
'ffmpeg -r 10 -i frame%03d.png -r ntsc movie.mpg'
doit être fine. Otoh, que, Si vous n'avez pas besoin de la puissance deframe%03d.png
,frame*.png
est un peu plus simple.Si vous voulez "voir la syntaxe pour elle si je remplace le" film.mpg' avec un nom de variable", il ressemble à quelque chose comme ceci:
cmd = 'ffmpeg -r 10 -i "frame%%03d.png" -r ntsc "%s"' % moviename
Nous avons besoin pour échapper à la
%
avec un supplément de%
pour se cacher de Python % de substitution des machines. J'ai aussi ajouté des guillemets"
, de faire face aux problèmes que tdelaney mentionné.frame%03d.png
. À l'aide de citations est inutile ici. Utilisationpipes.quote(moviename)
au lieu de"%s"
.Vrai, il n'y a pas d'espace ici, je viens de mettre les citations en exemple général de référence pour l'avenir. Otoh, que, je suis d'accord que les trucs que j'ai dit à propos de citer dans mon dernier commentaire à tdelaney post n'étaient pas utiles; je devrais le savoir mieux que de poster à 5H du matin. 🙂 Mais je ne savais pas à propos de
pipes.quote
, donc merci pour ça (bien que je vois dans les docs qu'il est dépréciée en Python 3).il n'y a pas de python-3.x de la balise, donc j'ai utilisé
pipes.quote
au lieu deshlex.quote
nom (c'est la même fonction).OriginalL'auteur PM 2Ring