FFmpeg — это мощный инструмент для работы с мультимедиа, который широко используется для редактирования видео, конвертации форматов и других задач. Однако использование командной строки FFmpeg (CLI) напрямую может быть связано с определёнными сложностями:
Сложные команды: Многочисленные параметры FFmpeg могут запутать новичков, а ошибки в настройках бывает непросто отладить.
Проблемы интеграции: При работе с современными языками, такими как 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 открывает новые возможности для разработчиков. Забудьте о громоздких командах и рисках ошибок — переходите на современный подход к обработке мультимедиа!