Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → FFmpeg: обработка видео

FFmpeg: обработка видео в командной строке

Обработка видео FFmpeg: структура команды, фильтры, извлечение фрагмента, изменение размера и проверка результата обработки.

Прямой ответ

Команда обработки состоит из источника, преобразования и приёмника, поэтому результат определяется порядком аргументов и набором фильтров.

Часть команды Что определяет
-i Источник данных
-filter Преобразование кадра либо потока
-c Кодек потока
Выходной файл Приёмник результата
ffmpeg -i input.mp4 -vf "scale=1280:720" -c:v libx264 -c:a aac output.mp4

Фильтр масштаба применяется до кодирования, поэтому размер кадра изменяется до сжатия, а не после. О кодеках — в статье про конвертацию видео.

Структура команды и порядок аргументов

Порядок аргументов определяет, к какому потоку применяется параметр, поэтому аргумент до источника относится к входу, а после — к выходу.

Аргументы входа. Параметры, записанные до указания источника, применяются к чтению, поэтому поиск по времени выполняется на стороне входа.

Аргументы выхода. Параметры после источника применяются к записи, поэтому кодек и битрейт задаются для приёмника.

Поток преобразования. Фильтры применяются между чтением и записью, поэтому кадр изменяется до кодирования.

Практическое следствие: параметр, записанный не в той позиции, применяется к иному потоку, поэтому результат отличается от ожидаемого без сообщения об ошибке.

Отдельный аспект — выбор потоков. Источник может содержать несколько видеопотоков и аудиодорожек, поэтому выбор потока указывается явно, иначе используется поток по умолчанию.

Фильтры и цепочка преобразований

Фильтр изменяет кадр либо поток, поэтому цепочка фильтров определяет последовательность преобразований.

Одиночный фильтр. Одно преобразование применяется к кадру, поэтому результат соответствует одному изменению.

Цепочка фильтров. Несколько фильтров соединяются в последовательность, поэтому каждое преобразование применяется к результату предыдущего.

Порядок в цепочке. Масштабирование до обрезки даёт иной результат, чем обрезка до масштабирования, поэтому порядок фиксируется явно.

Практическое следствие: цепочка фильтров в ином порядке даёт кадр иного размера либо соотношения сторон, поэтому результат отличается от ожидаемого.

Извлечение фрагмента и проверка результата

Извлечение фрагмента выполняется указанием начала и длительности, поэтому часть файла получается без полного перекодирования.

Начало фрагмента. Момент начала задаётся в позиции входа, поэтому поиск выполняется до декодирования и выполняется быстрее.

Длительность. Период фрагмента задаётся явно, поэтому конец определяется началом и длительностью.

Проверка результата. Параметры выходного файла читаются отдельно, поэтому длительность, размер и кодек подтверждаются по факту.

Практическое следствие: извлечение без проверки длительности даёт фрагмент, отличающийся от запрошенного, поскольку позиция поиска привязана к ключевому кадру.

О битрейте и качестве — в статье про сжатие видео; об изменении размера изображений — в статье про обработку изображений.

Практика: обработка видео в FFmpeg

1. Указывайте параметры входа до источника. Поиск и чтение применяются к входу, поэтому позиция задаётся корректно.

2. Задавайте кодек и битрейт после источника. Параметры применяются к приёмнику, поэтому результат кодируется указанным кодеком.

3. Выбирайте поток явно при нескольких дорожках. Поток по умолчанию может не соответствовать нужной дорожке.

4. Фиксируйте порядок фильтров в цепочке. Каждое преобразование применяется к результату предыдущего, поэтому порядок влияет на итог.

5. Применяйте масштабирование до кодирования. Размер кадра изменяется до сжатия, поэтому битрейт распределяется по итоговому размеру.

6. Проверяйте параметры выходного файла. Длительность, размер и кодек подтверждаются по факту, а не по команде.

7. Извлекайте фрагмент с указанием начала и длительности. Часть файла получается без полного перекодирования.

Рекомендации:

  1. Не смешивайте позиции аргументов входа и выхода. Параметр применяется к иному потоку, поэтому результат отличается без сообщения об ошибке.
  2. Учитывайте привязку поиска к ключевому кадру. Начало фрагмента может смещаться до ближайшего ключевого кадра.
  3. Сопоставляйте порядок фильтров с требуемым результатом. Масштабирование и обрезка в разном порядке дают иной кадр.
  4. Фиксируйте параметры кодирования в скрипте. Повторная обработка даёт одинаковый результат.
  5. Пересматриваем набор фильтров при изменении источника. Иное соотношение сторон требует изменения цепочки.

Практический сценарий: фрагмент начинался не с запрошенного момента

Контекст: извлечённый фрагмент видео начинался на несколько секунд раньше запрошенного момента, при этом длительность совпадала.

  1. Диагностика. Проверка параметров выходного файла показала, что длительность фрагмента соответствовала запрошенной, а начало смещалось. Параметр начала был записан после источника, поэтому применялся к выходу, а поиск выполнялся декодированием.
  2. Причина. Позиция поиска, заданная на стороне выхода, приводила к декодированию файла до нужного момента, а привязка к ключевому кадру смещала начало фрагмента.
  3. Действия. (а) Перенесли параметр начала в позицию входа, чтобы поиск выполнялся до декодирования; (б) добавили точное позиционирование с перекодированием, чтобы начало не привязывалось к ключевому кадру; (в) указали длительность фрагмента явно, чтобы конец определялся началом и длительностью; (г) добавили чтение параметров выходного файла в скрипт, чтобы начало и длительность подтверждались по факту; (д) сравнили несколько фрагментов и убедились в соответствии запрошенным моментам.
  4. Результат. Фрагмент начинается с запрошенного момента, поскольку поиск выполняется на стороне входа с точным позиционированием.

Вывод: параметр начала, записанный в позиции выхода, приводит к декодированию и привязке начала к ключевому кадру, поэтому фрагмент смещается. Позиционирование на стороне входа с точным поиском даёт фрагмент, начинающийся с запрошенного момента.

FAQ

Чем отличаются аргументы до и после источника? Аргументы до источника применяются к чтению входа, после — к записи выхода. Параметр в неверной позиции применяется к иному потоку.

Зачем проверять параметры выходного файла? Длительность, размер и кодек подтверждаются по факту. Команда может выполниться без ошибки, но с результатом, отличающимся от ожидаемого.

Почему начало фрагмента смещается? Поиск привязан к ключевому кадру, поэтому начало смещается до ближайшего ключевого кадра без точного позиционирования.

В каком порядке применять фильтры? В порядке, соответствующем требуемому результату. Каждое преобразование применяется к результату предыдущего, поэтому порядок влияет на итог.

Источники: FFmpeg documentation, FFmpeg filters, ffprobe — ссылки в шапке.