ffmpeg mit Rust

Ein Codebeispiel, das zeigt, wie man die ffmpeg_rs-Bibliothek in Rust verwendet, um FFmpeg-Funktionalität in einem Rust-Programm zu nutzen. Es öffnet eine Videodatei, liest Informationen über die darin enthaltenen Streams und gibt diese Informationen aus. FFmpeg muss selbst nicht installiert sein, sondern nur die erforderlichen Entwicklungspakete.

Es beginnt damit, FFmpeg zu initialisieren, um die Verwendung der Bibliothek in der Anwendung zu ermöglichen. Die ffmpeg::init().unwrap(); Zeile sorgt dafür, dass FFmpeg korrekt initialisiert wird.

Nach der Initialisierung wird der Dateipfad zur zu analysierenden Mediendatei als "video.mp4" festgelegt. Dann wird versucht, die Datei mit ffmpeg::format::input(&datei_pfad) zu öffnen. Wenn das Öffnen erfolgreich ist, werden verschiedene Informationen über die Datei abgerufen und angezeigt, darunter die Anzahl der Streams und die Codec-Parameter jedes Streams.

Falls beim Öffnen der Datei ein Fehler auftritt, wird dieser Fehler behandelt und eine Fehlermeldung wird ausgegeben.

Pakete installieren

apt install libavcodec-dev libavfilter-dev libavformat-dev libavdevice-dev libavutil-dev libswresample-dev libpostproc-dev libswscale-dev -y

Cargo.toml

[package]
name = "ffmpeg-test"
version = "0.1.0"
edition = "2021"

[dependencies]
ffmpeg-rs = "5.2.1"

main.rs

// Importiere das ffmpeg_rs Crate unter dem Alias "ffmpeg" für den Zugriff auf FFmpeg-Funktionen
extern crate ffmpeg_rs as ffmpeg;

fn main() {
    // Initialisiere FFmpeg und handle mögliche Fehler
    ffmpeg::init().unwrap();

    // Setze den Pfad zur Mediendatei, die du analysieren möchtest
    let datei_pfad = "video.mp4";

    // Verwende ein Result, um auf mögliche Fehler beim Öffnen der Datei zu reagieren
    match ffmpeg::format::input(&datei_pfad) {
        Ok(eingabe) => {
            // Wenn die Datei erfolgreich geöffnet wurde, zeige Informationen zur Datei an
            println!("Datei geöffnet: {:?}", datei_pfad);
            
            // Rufe `nb_streams` auf, um die Anzahl der Streams in der Datei zu erhalten
            println!("Anzahl der Streams: {}", eingabe.nb_streams());

            // Iteriere durch die Streams in der Datei
            for stream in eingabe.streams() {
                // Rufe `parameters` auf, um die Codec-Parameter für den aktuellen Stream abzurufen
                let codec_parameter = stream.parameters();
                
                // Gib den Stream-Typ und den zugehörigen Codec-Parameter aus
                println!("Streamtyp: {:?}", codec_parameter.codec_id());
            }
        }
        Err(fehler) => {
            // Wenn ein Fehler beim Öffnen der Datei auftritt, behandle ihn und gib eine Fehlermeldung aus
            eprintln!("Fehler beim Öffnen der Datei '{}' : {}", datei_pfad, fehler);
            // Hier kannst du weitere Fehlerbehandlungsschritte hinzufügen, z.B. das Programm beenden.
        }
    }

    // Kein Deinitialisieren von FFmpeg erforderlich, da es automatisch aufgeräumt wird
}

cargo run

    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/ffmpeg-test`
Datei geöffnet: "video.mp4"
Anzahl der Streams: 2
Streamtyp: H264
Streamtyp: AAC

Siehe auch

docs.rs/ffmpeg-rs
crates.io/crates/ffmpeg-rs
github.com/nullsauce/ffmpeg-rs