5 points par GN⁺ 2025-05-31 | 1 commentaires | Partager sur WhatsApp
  • 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

 
GN⁺ 2025-05-31
Commentaire Hacker News
  • C’est une prise de conscience de la réalité trop souvent sous-estimée que tous les parseurs d’options de ligne de commande et tous les toolkits constituent chacun leur propre langage de configuration complet et indépendant ; il faut considérer chaque outil comme un programme ou une configuration distincte fonctionnant dans ce langage. À cause des règles de découpage des mots dans le shell Unix et de syntaxes qui se ressemblent en surface, les gens ont tendance à imaginer un ensemble beaucoup plus uniforme qu’il ne l’est réellement. Personnellement, quand j’ai essayé tous les programmes de /usr/bin avec les options --help et -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.
    • D’après mon expérience, man foo est bien plus fiable et utile que foo --help ou foo -h.
    • En tant que débutant, je suis curieux de savoir précisément où se situaient les conflits et à quels points les divergences apparaissaient.
  • Le fait que le projet soit activement développé est impressionnant, mais il semble souffrir en partie des mêmes problèmes que ffmpeg-python. Par exemple, je ne vois pas comment spécifier des filtres comme color qui fonctionnent sans entrée. Il n’y a pas non plus de moyen apparent de définir des drapeaux Popen comme subprocess.CREATE_NO_WINDOW pour 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ès ffmpeg.compile(), mais cela ne s’applique pas à ffmpeg.probe(). En complément, j’ai identifié le problème des filtres source via ffmpeg.sources.color, mais je me demande s’il existe un moyen d’utiliser un filtre source arbitraire comme avec vfilter/afilter.
  • Si vous faites du traitement vidéo scripté en Python, je recommande vivement d’utiliser Vapoursynth. C’est un outil conçu dès le départ pour le traitement vidéo, avec une maintenance active, une communauté vivante et un écosystème d’outils bien fourni. On peut l’utiliser librement sans être contraint par la CLI de ffmpeg. Voici le lien vers le site de Vapoursynth.
  • C’est vraiment une excellente idée ; personnellement, j’attends une version TypeScript de ce projet.
    • J’ai fait un petit test avec l’outil de prévisualisation Jules pour voir à quoi pourrait ressembler une version TypeScript. L’implémentation est assez simple, même si une forme plus lisible me vient à l’esprit. Pour un prompt aussi court, le résultat n’est pas mauvais. Pour les curieux, voici le code de la branche multi-language-codegen.
    • Ce serait vraiment bien qu’une version TypeScript sorte aussi.
    • Une blague comparant TypeScript à la « langue des dieux ».
    • Il est fait remarquer que la mention de TypeScript n’apparaissait pas dans la documentation officielle.
  • Je pense qu’il faudrait décrire la forme de la ligne de commande ffmpeg de manière lisible par machine afin de permettre la génération automatique de code dans différents langages.
  • L’outil visuel est particulièrement impressionnant. FFMPEG semble être un très bon candidat pour gagner nettement en accessibilité grâce à une approche modulaire et de programmation visuelle. Beaucoup d’utilisateurs ne connaissent pas toutes les fonctionnalités, donc ce type d’approche peut réellement aider. Côté UX, j’espérais pouvoir supprimer les nœuds et les arêtes avec la touche DEL, et j’ai été un peu déçu que cela ne fonctionne pas, mais dans l’ensemble l’expérience est excellente.
    • Enfin un outil qui rappelle le GraphEdit de DirectShow chez Microsoft.
  • Je trouve ce projet vraiment intéressant ; s’il prenait aussi en charge le passage de frames par pipe entre commandes individuelles, cela ouvrirait la voie à une véritable extensibilité de l’usage de FFMpeg.
  • Je trouve ce projet tellement excellent que j’aimerais aussi présenter l’outil d’édition vidéo de newbeelearn, qui permet lui aussi de générer automatiquement des commandes ffmpeg pour faire du montage vidéo visuel.
  • Un court message d’encouragement : beau travail.
  • Le projet a l’air vraiment très sympa.