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

от автора

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


ссылка на оригинал статьи https://habr.com/ru/articles/901204/