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 открывает новые возможности для разработчиков. Забудьте о громоздких командах и рисках ошибок — переходите на современный подход к обработке мультимедиа!
ссылка на оригинал статьи https://habr.com/ru/articles/901204/
Добавить комментарий