4 Punkte von GN⁺ 2026-03-23 | 1 Kommentare | Auf WhatsApp teilen
  • Behandelt Aufbau und Verwendung des FFmpeg-Frameworks, mit dem sich Audio und Video kodieren, dekodieren, transkodieren und streamen lassen
  • Erklärt konkret die Rolle von Kommandozeilen-Tools wie ffmpeg, ffplay, ffprobe sowie zentralen Bibliotheken wie libavcodec, libavformat, libavfilter
  • Implementiert die Stream-Analyse und den Dekodierungsablauf rund um AVFormatContext, AVCodecContext, AVPacket, AVFrame Schritt für Schritt
  • Nutzt das meson/ninja-Build-System, um Beispielcode automatisch herunterzuladen und zu kompilieren sowie Beispiel-Mediendateien zu analysieren und die Ergebnisse auszugeben
  • Kann als praxisorientiertes Einstiegsmaterial zum Verständnis der internen Funktionsweise und Dekodierungspipeline von FFmpeg dienen

Aufbau des FFmpeg-Pakets

  • FFmpeg besteht aus einer Sammlung von Tools und Bibliotheken, mit denen sich verschiedenste Audio- und Videoformate kodieren, dekodieren, transkodieren und über Netzwerke streamen lassen
  • FFmpeg-Tools

    • ffmpeg: Kommandozeilenbasiertes Tool zur Konvertierung von Multimediaformaten
    • ffplay: Einfacher Mediaplayer auf Basis von SDL und den FFmpeg-Bibliotheken
    • ffprobe: Tool zur Analyse von Multimedia-Streams
  • FFmpeg-Bibliotheken

    • libavformat: Stellt Ein-/Ausgabe sowie Muxing/Demuxing bereit
    • libavcodec: Stellt Kodierungs-/Dekodierungsfunktionen bereit
    • libavfilter: Verarbeitung roher Medien über graphbasierte Filter
    • libavdevice: Unterstützung für Ein-/Ausgabegeräte
    • libavutil: Stellt gemeinsame Multimedia-Hilfsfunktionen bereit
    • libswresample: Unterstützt Audio-Resampling, Sample-Format-Konvertierung und Audio-Mixing
    • libswscale: Funktionen für Farbkonvertierung und Bildskalierung
    • libpostproc: Video-Nachbearbeitung (Deblocking, Rauschfilter usw.)

Einfacher FFmpeg-Player

  • Die grundlegende Nutzung von FFmpeg besteht darin, einen Multimedia-Stream zu demuxen, in Audio- und Video-Streams zu trennen und diese in rohe Audio-/Videodaten zu dekodieren
  • Wichtige Strukturen

    • AVFormatContext: Obergeordnete Struktur zur Verwaltung von Streamsynchronisation, Metadaten und Muxing
    • AVStream: Ein kontinuierlicher Audio- oder Videostream
    • AVCodec: Definiert die Art der Datenkodierung und -dekodierung
    • AVPacket: Kodierte Daten innerhalb eines Streams
    • AVFrame: Dekodierter roher Videoframe oder Audiosamples
  • Stream-Analyse und Demux-Ablauf

    • Speicher für AVFormatContext mit avformat_alloc_context() reservieren
    • Multimediadatei mit avformat_open_input() öffnen
    • Stream-Informationen in der Datei mit avformat_find_stream_info() analysieren
    • Time Base, Framerate, Startzeit, Länge, Typ und FourCC-Code jedes Streams ausgeben
    • Datei mit avformat_close_input() schließen und Speicher freigeben
  • Codec-Suche und Initialisierung

    • Mit avcodec_find_decoder() einen Decoder suchen, der zur Codec-ID des AVStream passt
    • Bei Videostreams Auflösung (width, height), bei Audiostreams Kanalanzahl und Samplerate ausgeben
    • AVCodecContext mit avcodec_alloc_context3() erzeugen
    • Codec-Parameter des Streams mit avcodec_parameters_to_context() auf den Decoder-Kontext anwenden
    • Decoder mit avcodec_open2() öffnen
  • Paketlesen und Dekodierung

    • Strukturen AVPacket und AVFrame jeweils zum Speichern kodierter Pakete und dekodierter Frames reservieren
    • Pakete mit av_read_frame() nacheinander aus der Eingabedatei lesen
    • Über den stream_index des Pakets identifizieren, aus welchem Stream es stammt
    • Nur Pakete des ausgewählten Videostreams (first_video_stream_index) an den Decoder senden
    • Paket mit avcodec_send_packet() an den Decoder übergeben
    • Dekodierte Frames wiederholt mit avcodec_receive_frame() empfangen
    • Nummer, Typ (I/P/B), Format, PTS und ob es sich um ein Keyframe handelt für jeden Frame ausgeben
    • Paketspeicher mit av_packet_unref() zur Wiederverwendung freigeben
    • Nach Abschluss aller Verarbeitung Speicher mit av_packet_free(), av_frame_free(), avcodec_free_context(), avformat_close_input() freigeben
  • Ausführung und Ergebnisbeispiel

    • Der Beispielcode ist im GitHub-Repository verfügbar
    • Build mit meson und ninja möglich (pip3 install meson ninja)
    • Beim Ausführen von meson setup build wird FFmpeg automatisch heruntergeladen und konfiguriert
    • Nach dem Build mit ninja -C build Ausführung über ./build/ffmpeg-101 sample.mp4
    • Die Ausgabe zeigt Dateiformat, Stream-Informationen (Video/Audio), Codec, Auflösung, Samplerate, die PTS jedes Pakets und Informationen zu den dekodierten Frames
  • Zusammenfassung des Ausgabe-Beispiels

    • Videostream: H.264 (avc1), Auflösung 206x80, Framerate 30fps
    • Audiostream: AAC (mp4a), 2 Kanäle, 44.1kHz
    • PTS und Frame-Typ (I/P) jedes Pakets werden der Reihe nach angezeigt, und der Dekodierungsprozess wird in der Konsole ausgegeben

Build- und Laufzeitumgebung

  • Benötigte Tools: Python, pip, meson, ninja
  • Installationsbefehl: pip3 install meson ninja
  • Build-Ablauf

    • Das Beispiel-Archiv in den Ordner ffmpeg-101 entpacken
    • meson setup build ausführen
    • Mit ninja -C build bauen
    • Mit ./build/ffmpeg-101 sample.mp4 ausführen
    • Falls FFmpeg nicht auf dem System installiert ist, wird es automatisch heruntergeladen und eingerichtet

1 Kommentare

 
GN⁺ 2026-03-23
Hacker-News-Kommentare
  • Für alle, die die interne Funktionsweise von FFmpeg und libav wirklich tief verstehen möchten, ist Leandro Moreiras Tutorial eine klare Empfehlung
    Persönlich finde ich, dass es die bisher vollständigste und verständlichste Erklärung ist
    Link zum FFmpeg-libav-Tutorial

    • Dieses Tutorial hilft wirklich sehr. Danke
    • Die Befehle im Original waren nicht besonders interessant, aber dieses Tutorial wirkt viel praxisnäher
  • Erstaunlich, dass es schon ffmpeg 101 gibt. Es fühlt sich an, als wäre ffmpeg 8 erst gestern erschienen

    • Das wirkt, als hätten Agenten im Schlaf Code gepusht, freigegeben und veröffentlicht
  • Es wird noch ein weiterer Guide geteilt
    Link zum zugehörigen HN-Guide

  • FFmpeg ist wirklich ein geliebtes Tool

  • Das war ein großartiger Einstieg in ffmpeg. Danke

  • ffmpeg ist eine echte Superkraft
    Ich nutze es immer, wenn ich mehrere Video-Segmente zu einer einzigen abspielbaren Form zusammensetze