Прямой ответ
Команда обработки состоит из источника, преобразования и приёмника, поэтому результат определяется порядком аргументов и набором фильтров.
| Часть команды | Что определяет |
|---|---|
| -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. Извлекайте фрагмент с указанием начала и длительности. Часть файла получается без полного перекодирования.
Рекомендации:
- Не смешивайте позиции аргументов входа и выхода. Параметр применяется к иному потоку, поэтому результат отличается без сообщения об ошибке.
- Учитывайте привязку поиска к ключевому кадру. Начало фрагмента может смещаться до ближайшего ключевого кадра.
- Сопоставляйте порядок фильтров с требуемым результатом. Масштабирование и обрезка в разном порядке дают иной кадр.
- Фиксируйте параметры кодирования в скрипте. Повторная обработка даёт одинаковый результат.
- Пересматриваем набор фильтров при изменении источника. Иное соотношение сторон требует изменения цепочки.
Практический сценарий: фрагмент начинался не с запрошенного момента
Контекст: извлечённый фрагмент видео начинался на несколько секунд раньше запрошенного момента, при этом длительность совпадала.
- Диагностика. Проверка параметров выходного файла показала, что длительность фрагмента соответствовала запрошенной, а начало смещалось. Параметр начала был записан после источника, поэтому применялся к выходу, а поиск выполнялся декодированием.
- Причина. Позиция поиска, заданная на стороне выхода, приводила к декодированию файла до нужного момента, а привязка к ключевому кадру смещала начало фрагмента.
- Действия. (а) Перенесли параметр начала в позицию входа, чтобы поиск выполнялся до декодирования; (б) добавили точное позиционирование с перекодированием, чтобы начало не привязывалось к ключевому кадру; (в) указали длительность фрагмента явно, чтобы конец определялся началом и длительностью; (г) добавили чтение параметров выходного файла в скрипт, чтобы начало и длительность подтверждались по факту; (д) сравнили несколько фрагментов и убедились в соответствии запрошенным моментам.
- Результат. Фрагмент начинается с запрошенного момента, поскольку поиск выполняется на стороне входа с точным позиционированием.
Вывод: параметр начала, записанный в позиции выхода, приводит к декодированию и привязке начала к ключевому кадру, поэтому фрагмент смещается. Позиционирование на стороне входа с точным поиском даёт фрагмент, начинающийся с запрошенного момента.
FAQ
Чем отличаются аргументы до и после источника? Аргументы до источника применяются к чтению входа, после — к записи выхода. Параметр в неверной позиции применяется к иному потоку.
Зачем проверять параметры выходного файла? Длительность, размер и кодек подтверждаются по факту. Команда может выполниться без ошибки, но с результатом, отличающимся от ожидаемого.
Почему начало фрагмента смещается? Поиск привязан к ключевому кадру, поэтому начало смещается до ближайшего ключевого кадра без точного позиционирования.
В каком порядке применять фильтры? В порядке, соответствующем требуемому результату. Каждое преобразование применяется к результату предыдущего, поэтому порядок влияет на итог.
Источники: FFmpeg documentation, FFmpeg filters, ffprobe — ссылки в шапке.