- typed-ffmpeg est un wrapper moderne qui permet d’utiliser FFmpeg de façon intuitive en Python
- Il offre une prise en charge puissante du typage, une documentation riche et l’autocomplétion dans l’IDE pour améliorer l’expérience de développement et la stabilité du code
- Il facilite la création de graphes de filtres complexes et prend en charge des fonctions avancées comme la visualisation et la sérialisation JSON
- L’installation et l’exécution sont simples, et un playground interactif permet aussi d’expérimenter dans le navigateur
- Inspiré de ffmpeg-python, il corrige des limites existantes et prévoit de prendre en charge davantage de versions de FFmpeg et de filtres à l’avenir
Présentation et importance de typed-ffmpeg
- typed-ffmpeg est un package open source permettant de contrôler FFmpeg de manière moderne et Pythonic
- Construit uniquement avec la bibliothèque standard de Python, il est sans dépendances et offre de solides garanties de sécurité et de compatibilité
- Son principal atout réside dans sa riche prise en charge du typage, sa syntaxe simple, l’autocomplétion et la documentation inline, qui permettent de coder facilement et de façon fiable des traitements FFmpeg complexes
- Il comble les limites de ffmpeg-python, notamment en matière d’intégration IDE et d’absence de types, tout en ajoutant diverses nouveautés comme la sérialisation JSON, la validation automatique des graphes de filtres et les graphes visuels
- Dans le processus réel de wrapping et d’automatisation, GPT-3 et Copilot ont contribué à la productivité du développement, mais un autre point distinctif est l’approche retenue pour le cœur de la génération de code, fondée sur une génération de code traditionnelle et fiable
Fonctionnalités principales (Features)
- Sans dépendances : utilise uniquement la bibliothèque standard de Python
- Interface intuitive : permet de composer facilement des graphes de filtres FFmpeg en code Python
- Prise en charge étendue des filtres : prend en charge la plupart des filtres FFmpeg avec autocomplétion dans l’IDE
- Documentation intégrée : les docstrings inline réduisent au minimum le besoin de consulter une documentation externe
- Prise en charge robuste du typage : les vérifications de types statiques et dynamiques renforcent la fiabilité du code et facilitent le débogage
- Sérialisation des graphes de filtres : permet de sauvegarder et restaurer les graphes de filtres au format JSON
- Visualisation des graphes : propose une représentation des graphes de filtres via graphviz
- Validation et correction automatiques : détection des erreurs dans les graphes de filtres et fonctions de correction automatique
- Extension des options d’entrée/sortie : élargit les usages de FFmpeg grâce à la prise en charge de divers codecs et formats
- Évaluation partielle : favorise la modularisation et la réutilisabilité des graphes de filtres
Fonctionnalités prévues
- Extension prévue d’une large compatibilité avec des versions autres que FFmpeg 6.0
- Prise en charge prévue d’un plus grand nombre de filtres complexes, avec une extension continue des fonctionnalités
Exemple rapide (Quick Usage)
import ffmpeg
# Inverser horizontalement une vidéo puis produire la sortie
f = (
ffmpeg
.input(filename='input.mp4')
.hflip()
.output(filename='output.mp4')
)
f
- Exemple plus complexe : possibilité d’exprimer un graphe de filtres qui découpe plusieurs segments puis ajoute
overlay et drawbox
import ffmpeg.filters
import ffmpeg
in_file = ffmpeg.input("input.mp4")
overlay_file = ffmpeg.input("overlay.png")
f = (
ffmpeg.filters
.concat(
in_file.trim(start_frame=10, end_frame=20),
in_file.trim(start_frame=30, end_frame=40),
)
.video(0)
.overlay(overlay_file.hflip())
.drawbox(x="50", y="50", width="120", height="120", color="red", thickness="5")
.output(filename="out.mp4")
)
f
- Davantage d’exemples et d’explications détaillées sont disponibles dans la documentation
Playground interactif
- Dans le navigateur, il est possible d’expérimenter des filtres et commandes FFmpeg, de visualiser les résultats, de tester différentes options d’entrée/sortie, d’apprendre à partir d’exemples interactifs et de partager des graphes de filtres
- C’est un environnement très efficace pour prototyper et apprendre les chaînes de filtres FFmpeg, même sans environnement local
Contexte du projet et remerciements
- Le projet a démarré en s’inspirant d’une idée de génération automatique de SDK à partir de la documentation FFmpeg avec GPT-3
- La génération du cœur a été réorientée vers une approche de génération de code manuelle afin de garantir la fiabilité
- Au cours du développement, GitHub Copilot et GPT-3 ont contribué à améliorer l’efficacité du développement
- ffmpeg-python a inspiré le style d’API et le design, influençant fortement la conception
- Le projet est dédié à Austin, l’enfant du développeur
Documentation et références
- Des informations plus détaillées et des fonctionnalités avancées sont disponibles dans la Documentation officielle
- En plus de l’installation du package principal, la prise en charge de graphviz peut être activée via une option séparée pour des fonctionnalités additionnelles comme la visualisation des graphes
- Une version distincte (typed-ffmpeg-compatible) est proposée pour assurer la compatibilité avec ffmpeg-python
1 commentaires
Commentaire Hacker News
/usr/binavec les options--helpet-h, le taux d’échec pour obtenir l’aide attendue a été étonnamment élevé. Introduire des informations de type dans un outil complexe comme ffmpeg est encourageant, car cela aide à prendre conscience de cette diversité tout en apportant des bénéfices concrets.man fooest bien plus fiable et utile quefoo --helpoufoo -h.colorqui fonctionnent sans entrée. Il n’y a pas non plus de moyen apparent de définir des drapeaux Popen commesubprocess.CREATE_NO_WINDOWpour empêcher l’ouverture d’une fenêtre CMD dans une application GUI. On peut contourner cela pour ffmpeg via une exécution manuelle aprèsffmpeg.compile(), mais cela ne s’applique pas àffmpeg.probe(). En complément, j’ai identifié le problème des filtres source viaffmpeg.sources.color, mais je me demande s’il existe un moyen d’utiliser un filtre source arbitraire comme avec vfilter/afilter.