Как стать автором
Обновить

От командной строки FFmpeg к Rust: практическое руководство для различных сценариев

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров1.5K

FFmpeg — это мощный инструмент для работы с мультимедиа, который широко используется для редактирования видео, конвертации форматов и других задач. Однако использование командной строки FFmpeg (CLI) напрямую может быть связано с определёнными сложностями:

  1. Сложные команды: Многочисленные параметры FFmpeg могут запутать новичков, а ошибки в настройках бывает непросто отладить.

  2. Проблемы интеграции: При работе с современными языками, такими как Rust, вызов C API FFmpeg требует управления памятью и обеспечения безопасности, что может привести к утечкам памяти или другим ошибкам.

Rust-сообщество предлагает решение — библиотеку ez-ffmpeg, которая упрощает и делает безопасным использование FFmpeg в Rust. В этой статье мы разберём несколько практических примеров, как перейти от команд FFmpeg к лаконичному коду на Rust.


1. Конвертация формата видео

Простая задача: преобразовать видео из одного формата в другой.

Команда FFmpeg:

ffmpeg -i input.mp4 output.avi

Код на Rust:

use ez_ffmpeg::{FfmpegContext, FfmpegScheduler};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let context = FfmpegContext::builder()
        .input("input.mp4")
        .output("output.avi")
        .build()?;

    FfmpegScheduler::new(context)
        .start()?
        .wait()?;
    Ok(())
}

С помощью ez-ffmpeg процесс становится интуитивно понятным и безопасным.


2. Извлечение аудио

Допустим, нужно извлечь аудиодорожку из видео без перекодирования.

Команда FFmpeg:

ffmpeg -i input.mp4 -vn -acodec copy output.aac

Код на Rust:

use ez_ffmpeg::{FfmpegContext, FfmpegScheduler};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let context = FfmpegContext::builder()
        .input("input.mp4")
        .output("output.aac")
        .no_video()
        .build()?;

    FfmpegScheduler::new(context)
        .start()?
        .wait()?;
    Ok(())
}

Метод .no_video() отключает видео, оставляя только аудио — просто и надёжно.


3. Обрезка видео

Обрежем видео, выбрав 5 секунд, начиная с 10-й.

Команда FFmpeg:

ffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:05 -c copy output.mp4

Код на Rust:

use ez_ffmpeg::{FfmpegContext, Input, FfmpegScheduler};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let context = FfmpegContext::builder()
        .input(Input::from("input.mp4")
            .set_start_time_us(10_000_000)
            .set_recording_time_us(5_000_000))
        .output("output.mp4")
        .build()?;

    FfmpegScheduler::new(context)
        .start()?
        .wait()?;
    Ok(())
}

Точные временные интервалы задаются в микросекундах, что даёт полный контроль.


4. Конвертация видео в GIF

Создадим GIF с изменением частоты кадров и размера.

Команда FFmpeg:

ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" -c:v gif output.gif

Код на Rust:

use ez_ffmpeg::{FfmpegContext, FfmpegScheduler};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let context = FfmpegContext::builder()
        .input("input.mp4")
        .filter_desc("fps=10,scale=320:-1:flags=lanczos")
        .output("output.gif")
        .build()?;

    FfmpegScheduler::new(context)
        .start()?
        .wait()?;
    Ok(())
}

Фильтры FFmpeg легко интегрируются через .filter_desc().


5. Слияние видео

Объединим два видеофайла в один.

Команда FFmpeg:

ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

Код на Rust:

use ez_ffmpeg::{FfmpegContext, FfmpegScheduler};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let inputs = vec!["file1.mp4", "file2.mp4"];

    let context = FfmpegContext::builder()
        .inputs(inputs)
        .output("output.mp4")
        .build()?;

    FfmpegScheduler::new(context)
        .start()?
        .wait()?;
    Ok(())
}

Метод .inputs() позволяет объединить несколько файлов без лишних сложностей.


Почему стоит попробовать?

Библиотека ez-ffmpeg в сочетании с безопасностью и производительностью Rust открывает новые возможности для разработчиков. Забудьте о громоздких командах и рисках ошибок — переходите на современный подход к обработке мультимедиа!

Теги:
Хабы:
0
Комментарии6

Публикации

Работа

Rust разработчик
8 вакансий

Ближайшие события