Обработка аудио и видео может показаться сложной задачей, но в разработке нам рано или поздно приходится сталкиваться с такими задачами, как конвертация форматов видео, обрезка, добавление водяных знаков или извлечение аудио.
FFmpeg — это признанный стандарт в индустрии, который умеет почти всё. Его используют популярные программы, такие как VLC, YouTube и OBS. Однако у FFmpeg есть свои подводные камни, которые могут доставить разработчикам головную боль:
Высокий порог входа: нужно разбираться в таких понятиях, как мультиплексирование/демультиплексирование, кодирование/декодирование, форматы пикселей и частота дискретизации.
Реализация на C: прямой вызов может привести к проблемам с управлением памятью — одно неверное движение, и вы столкнётесь с утечками памяти, некорректным доступом или крахом программы.
Сложный код: низкоуровневая природа FFmpeg делает его поддержку и отладку настоящим кошмаром.
Rust славится своей безопасностью памяти и высокой производительностью. Возникает вопрос: можно ли в Rust использовать FFmpeg просто, безопасно и в привычном для нас стиле?
ez-ffmpeg: элегантное решение для Rust-разработчиков
ez-ffmpeg
позволяет создавать и выполнять задачи FFmpeg так, будто вы пишете обычный код на Rust, используя цепочки вызовов.
Библиотека обращается к низкоуровневому коду FFmpeg через FFI, при этом автоматически управляет памятью, избавляя вас от типичных проблем с безопасностью, характерных для C.
Быстрый старт: конвертация формата на Rust
Предположим, нам нужно конвертировать видео (или аудио, или изображение) в другой формат. С ez-ffmpeg
это займёт всего несколько строк кода:
1. Установка FFmpeg
Если FFmpeg ещё не установлен, вот как это сделать:
macOS:
brew install ffmpeg
Windows:
vcpkg install ffmpeg
# Если vcpkg устанавливается впервые, настройте переменную окружения VCPKG_ROOT
2. Добавление зависимости в Rust
Добавьте ez-ffmpeg
в ваш Cargo.toml
:
[dependencies]
ez-ffmpeg = "*"
3. Пример кода
use ez_ffmpeg::FfmpegContext;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. Создаём контекст FFmpeg
let context = FfmpegContext::builder()
.input("input.mp4") // входной файл
.output("output.mov") // выходной файл
.build()?;
// 2. Запускаем задачу и ждём завершения
context.start()?.wait()?;
Ok(())
}
Всё! Вам нужно только указать входной и выходной файлы, а ez-ffmpeg
сделает остальное.
Больше, чем просто конвертация
С ez-ffmpeg
вы можете легко выполнять такие задачи, как:
Обрезка видео;
Извлечение аудио или видео;
Добавление фильтров;
Потоковая передача через RTMP;
Ускорение обработки с помощью GPU.
Ознакомьтесь с примерами в официальной документации: examples.
Итог
В отличие от работы с FFmpeg через командную строку, ez-ffmpeg
позволяет Rust-разработчикам плавно переносить команды в код, не изучая при этом C.
Библиотека поддерживает пользовательские фильтры и управление вводом/выводом прямо на Rust, избавляя от сложностей с расширениями на C и мучений с компиляцией FFmpeg.
🔗 Адрес проекта на GitHub: ez-ffmpeg