Как правильно перекодировать видео с несколькими разрешениями с помощью FFmpeg
Перекодирование видеофайлов — это распространенная задача, особенно когда необходимо оптимизировать файлы для работы с различными разрешениями. В данной статье мы рассмотрим, как правильно перекодировать видеоматериалы с использованием FFmpeg, чтобы избежать распространенных ошибок и сохранить качество.
Проблема с разрешением
При работе с видеофайлами у пользователей часто возникает проблема, когда FFmpeg считывает разрешение первого кадра и масштабирует все оставшиеся кадры до этого разрешения. Например, в одиночном режиме разрешение может составлять 720×1280, но при переключении на ПК оно изменяется на 900×720. При перекодировании это может привести к тому, что видео будет неправильно отображаться.
Решение проблемы с масштабированием
Для решения этой проблемы необходимо масштабировать и дополнить все видео до одного разрешения, например, 900×720. Для этого можно использовать следующую команду:
ffmpeg -y -i original.flv -vf "scale=if(lt(iw/ih,900/720),-2,900):if(lt(iw/ih,900/720),720,-2),pad=900:720:(ow-iw)/2:(oh-ih)/2,setsar=1" -c:v libx264 re-encode.mp4
Эта команда выполняет следующие действия:
- Устанавливает ширину 900, если видео слишком широкое, иначе — сохраняетAspect Ratio.
- Устанавливает высоту 720, если видео слишком высокое.
- Добавляет черные поля для фиксации разрешения 900×720.
Перекодирование видео с несколькими разрешениями
Иногда необходимо перекодировать видео, имеющее несколько разрешений. Стандартным методом является разбиение файла на несколько сегментов, затем перекодировка каждого сегмента, и, наконец, объединение сегментов в один файл. Вот шаги, которые помогут в этом процессе:
-
Разделите видео на сегменты:
Используйте следующий код для разделения исходного файла:ffmpeg -i original.flv -c copy -f segment -segment_time 0 -segment_list list.txt -segment_list_type ffconcat %05d.flv
-
Закодируйте каждый сегмент:
Перекодируйте каждый сегмент с помощью кодека AV1:ffmpeg -y -i 00000.flv -c:v libaom-av1 -crf 32 00000.mp4 ffmpeg -y -i 00001.flv -c:v libaom-av1 -crf 32 00001.mp4 ffmpeg -y -i 00002.flv -c:v libaom-av1 -crf 32 00002.mp4 ffmpeg -y -i 00003.flv -c:v libaom-av1 -crf 32 00003.mp4
-
Редактируйте созданный list.txt:
Замените расширение.flv
на.mp4
в файлеlist.txt
. - Объедините файлы сегментов:
Для объединения файлов воспользуйтесь следующим кодом:ffmpeg -y -f concat -safe 0 -i list.txt -c copy output.mp4
Проверка результатов
После выполнения всех этапов стоит убедиться, что файл output.mp4
содержит несколько разрешений. Для этого вы можете использовать FFprobe:
ffprobe -i output.mp4 -show_frames -select_streams v -show_entries frame=pkt_pts_time,width,height -of csv
В результате выполнения вы должны увидеть вывод, который подтвердит наличие различных разрешений в вашем видео.
Заключение
Перекодирование видеофайлов с различными разрешениями может показаться сложной задачей, но с помощью FFmpeg и правильных команд это можно сделать достаточно просто. Не забывайте, что при работе с видео важно учитывать соотношение сторон и разрешение для достижения наилучших результатов.