4 points par GN⁺ 2026-03-23 | 1 commentaires | Partager sur WhatsApp
  • Présentation de l’architecture et de l’usage du framework FFmpeg, capable d’encoder, décoder, transcoder et diffuser en streaming de l’audio et de la vidéo
  • Explication détaillée du rôle des outils en ligne de commande comme ffmpeg, ffplay, ffprobe et des bibliothèques clés comme libavcodec, libavformat, libavfilter
  • Implémentation pas à pas de l’analyse de flux et du processus de décodage autour de AVFormatContext, AVCodecContext, AVPacket, AVFrame
  • Utilisation du système de build meson/ninja pour télécharger et compiler automatiquement le code d’exemple, puis analyser des fichiers média d’exemple et afficher les résultats
  • Peut servir de ressource d’introduction pratique pour comprendre le fonctionnement interne de FFmpeg et le pipeline de décodage

Composition du paquet FFmpeg

  • FFmpeg est un ensemble d’outils et de bibliothèques permettant d’encoder, décoder, transcoder divers formats audio/vidéo et de les diffuser en streaming sur le réseau
  • Outils FFmpeg

    • ffmpeg : outil en ligne de commande de conversion de formats multimédia
    • ffplay : lecteur multimédia simple basé sur SDL et les bibliothèques FFmpeg
    • ffprobe : outil d’analyse des flux multimédia
  • Bibliothèques FFmpeg

    • libavformat : fournit les fonctions d’entrée/sortie et de muxing/demuxing
    • libavcodec : fournit les fonctions d’encodage/décodage
    • libavfilter : traitement des médias bruts via des filtres basés sur des graphes
    • libavdevice : prise en charge des périphériques d’entrée/sortie
    • libavutil : fournit des utilitaires multimédia communs
    • libswresample : prise en charge du rééchantillonnage audio, de la conversion de format d’échantillons et du mixage audio
    • libswscale : fonctions de conversion de couleurs et de mise à l’échelle d’images
    • libpostproc : fonctions de post-traitement vidéo (deblocking, filtres de bruit, etc.)

Lecteur FFmpeg simple

  • Le mode d’utilisation fondamental de FFmpeg consiste à demuxer un flux multimédia pour le séparer en flux audio et vidéo, puis à le décoder en données audio/vidéo brutes
  • Structures principales

    • AVFormatContext : structure de haut niveau qui gère la synchronisation du flux, les métadonnées et le muxing
    • AVStream : flux audio ou vidéo continu
    • AVCodec : définit la méthode d’encodage et de décodage des données
    • AVPacket : données encodées dans le flux
    • AVFrame : frame vidéo brute décodée ou échantillons audio décodés
  • Analyse du flux et processus de demux

    • Allocation de mémoire pour AVFormatContext avec avformat_alloc_context()
    • Ouverture du fichier multimédia avec avformat_open_input()
    • Analyse des informations de flux contenues dans le fichier avec avformat_find_stream_info()
    • Affichage de la base de temps (time base), de la fréquence d’images, de l’heure de début, de la durée, du type et du code FourCC de chaque flux
    • Fermeture du fichier et libération de la mémoire avec avformat_close_input()
  • Recherche et initialisation du codec

    • Recherche du décodeur correspondant à l’identifiant de codec du AVStream avec avcodec_find_decoder()
    • Pour le flux vidéo, affichage de la résolution (width, height) ; pour le flux audio, affichage du nombre de canaux et du taux d’échantillonnage
    • Création de AVCodecContext avec avcodec_alloc_context3()
    • Application des paramètres de codec du flux au contexte de décodage avec avcodec_parameters_to_context()
    • Ouverture du décodeur avec avcodec_open2()
  • Lecture des paquets et décodage

    • Allocation des structures AVPacket et AVFrame pour stocker respectivement les paquets encodés et les frames décodées
    • Lecture séquentielle des paquets depuis le fichier d’entrée avec av_read_frame()
    • Identification du flux d’origine via le stream_index du paquet
    • Envoi au décodeur uniquement des paquets du flux vidéo sélectionné (first_video_stream_index)
    • Transmission du paquet au décodeur avec avcodec_send_packet()
    • Réception répétée des frames décodées avec avcodec_receive_frame()
    • Affichage du numéro de chaque frame, de son type (I/P/B), de son format, de son PTS et de son statut de keyframe
    • Réutilisation de la mémoire des paquets avec av_packet_unref()
    • Une fois tout le traitement terminé, libération de la mémoire avec av_packet_free(), av_frame_free(), avcodec_free_context() et avformat_close_input()
  • Exécution et exemple de résultat

    • Le code d’exemple est fourni dans le dépôt GitHub
    • Build possible avec meson et ninja (pip3 install meson ninja)
    • Lors de l’exécution de meson setup build, FFmpeg est automatiquement téléchargé et configuré
    • Après le build avec ninja -C build, exécution via ./build/ffmpeg-101 sample.mp4
    • Le résultat affiche le format du fichier, les informations sur les flux (vidéo/audio), le codec, la résolution, le taux d’échantillonnage, ainsi que le PTS de chaque paquet et les informations des frames décodées
  • Résumé de l’exemple de sortie

    • Flux vidéo : H.264 (avc1), résolution 206x80, fréquence d’images 30fps
    • Flux audio : AAC (mp4a), 2 canaux, 44.1kHz
    • Le PTS de chaque paquet et le type de frame (I/P) s’affichent séquentiellement, tandis que le processus de décodage est imprimé dans la console

Environnement de build et d’exécution

  • Outils nécessaires : Python, pip, meson, ninja
  • Commande d’installation : pip3 install meson ninja
  • Procédure de build

    • Extraire l’archive de l’exemple dans le dossier ffmpeg-101
    • Exécuter meson setup build
    • Compiler avec ninja -C build
    • Exécuter ./build/ffmpeg-101 sample.mp4
    • Si FFmpeg n’est pas installé sur le système, il est automatiquement téléchargé et configuré

1 commentaires

 
GN⁺ 2026-03-23
Avis sur Hacker News
  • Pour ceux qui veulent comprendre en profondeur le fonctionnement interne de FFmpeg et de libav, le tutoriel de Leandro Moreira est vivement recommandé
    Personnellement, c’est l’explication la plus complète et la plus claire que j’aie vue jusqu’à présent
    Lien vers le tutoriel FFmpeg-libav

    • Ce tutoriel aide vraiment. Merci
    • Les commandes de l’article original n’étaient pas très intéressantes, mais ce tutoriel semble bien plus pratique
  • Étonné qu’on en soit déjà à ffmpeg 101. J’ai l’impression que ffmpeg 8 est sorti hier

    • On dirait le résultat d’un agent qui pousse du code, approuve et publie des releases pendant qu’on dort
  • Partage d’un autre guide
    Lien vers le guide connexe sur HN

  • FFmpeg, c’est vraiment un outil que j’adore

  • Excellente ressource d’introduction à ffmpeg. Merci

  • ffmpeg est un véritable super-pouvoir
    Je l’utilise toujours pour assembler plusieurs fragments vidéo en une forme lisible