4 points par GN⁺ 2026-03-23 | Aucun commentaire pour le moment. | 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é

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.