- 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.