В опубликованной ранее статье "Обнуление тега ориентации в MP4-видео" отмечалось, что формат MP4 поддерживает специальный метатег "Rotation", присутствие которого в уже физически повернутом видео приводит к дополнительному повороту изображения некоторыми плеерами.
В упоминаемой выше статье было предложено решение сбрасывать этот метатег с помощью библиотеки FFmpeg после того, как видео было физически повернуто и сохранено с помощью медиапроигрывателя VLC. Такой подход также не совсем удобный, т.к. кроме того, что нужно выполнять два операции с видео, создавался еще и промежуточный файл.
В настоящей статье Вы узнаете, как просто можно физически повернуть MP4-видео вместе с автоматическим обнулением тега ориентации, используя всего лишь один инструмент FFmpeg.
Подготовка FFmpeg
Библиотека FFmpeg может поставляться по разному в зависимости от выбранных опций загрузки на официальном сайте. Для нашей задачи нужен статический вариант в виде единого файла, исполняемого в командной строке Windows. Подробнее о том, как скачать и распаковать FFmpeg, читайте в разделах "Скачивание FFmpeg" и "Распаковка FFmpeg" статьи "Обнуление тега ориентации в MP4-видео".
Итак, предположим, что Вы уже распаковали исполняемый файл "ffmpeg.exe" в папку вместе с видео, которое нужно повернуть. Откройте окно командной строки в этой папке, для этого наберите "cmd" в строке пути проводника Windows и нажмите клавишу "Enter".
Откроется окно командной строки с уже прописанным путем к текущей папке. Все приведенные в статье команды нужно выполнять в этом окне.
Поворот видео в FFmpeg
В FFmpeg можно повернуть видео тремя способами, а именно с помощью следующих фильтров: transpose, hflip совместно с vflip и rotate.
Фильтр transpose (90, 180, 270 градусов)
Поворот видео на 90 (270) градусов
Фильтр transpose позволяет транспонировать, т.е. заменять ряды столбцами пикселей видео.
Для поворота MP4-видео на 90 градусов по часовой стрелке с помощью фильтра transpose наберите следующую команду и нажмите клавишу "Enter" (время конвертирования зависит от размера видео и мощности компьютера):
ffmpeg -i input.mp4 -vf "transpose=1" -c:a copy output.mp4
Обозначения составляющих команды:
- ffmpeg – вызов исполняемого файла "ffmpeg.exe" (должен присутствовать в папке вместе с видеофайлами);
- -i input.mp4 – выбор файла-источника (например, "input.mp4");
- -vf "transpose=1" – задействовать фильтр транспонирования с поворотом на 90 градусов по часовой стрелке;
- -c:a copy – скопировать оригинальную звуковую дорожку без конвертирования;
- output.mp4 – задайте желаемое имя конечного файла.
Возможные значения фильтра transpose:
- 0 или cclock_flip – поворот на 90 градусов против часовой стрелки (270 градусов по часовой стрелке) и зеркальное отражение по вертикали (значение по умолчанию);
- 1 или clock – поворот на 90 градусов по часовой стрелке;
- 2 или cclock – поворот на 90 градусов против часовой стрелки (270 градусов по часовой стрелке);
- 3 или clock_flip – поворот на 90 градусов по часовой стрелке и зеркальное отражение по вертикали.
Хоть и числовые значения считаются устаревшими (официальная документация рекомендует использовать символические значения), их быстрее набирать и они прекрасно работали на момент написания статьи.
Фильтр может принимать другие значения и параметры. Если Вам интересно, с ними можно ознакомиться в документации FFmpeg (на англ.).
Копирование звуковой дорожки без потерь
Известно, что при любом конвертировании с потерями качество видео и аудио ухудшается. Поэтому во всех командах этой статьи мы используем параметр "-c:a copy", который указывает FFmpeg, что звуковой поток не нужно конвертировать, а просто скопировать из исходного файла в конечный (нам ведь только видео нужно изменить). Конечно, если Вы сохраняете видео в другом формате, не поддерживающем аудиокодек исходного MP4-видео (обычно AAC), тогда нужно опустить данный параметр.
Принудительное обнуление тега ориентации
Последняя на момент написания статьи сборка FFmpeg учитывала, а затем автоматически сбрасывала метатег "Rotation" при конвертировании MP4-видео, т.е. повернутое видео корректно отображалось в старых и новых проигрывателях. В более старых версиях FFmpeg его нужно было сбрасывать вручную, использовав параметр "-metadata:s:v:0 rotate=0":
ffmpeg -i input.mp4 -vf "transpose=1" -metadata:s:v:0 rotate=0 -c:a copy output.mp4
Поворот видео на 180 градусов
Для поворота MP4-видео на 180 градусов, фильтр transpose необходимо задействовать дважды:
ffmpeg -i input.mp4 -vf "transpose=2,transpose=2" -c:a copy output.mp4
То есть повернуть видео дважды на 90 градусов.
Фильтры hflip и vflip (180 градусов)
Данные фильтры позволяют только перевернуть видео. Фильтр hflip отражает видео зеркально по горизонтали, а фильтр vflip – по вертикали. Таким образом, совместная их работа создает перевернутое видео:
ffmpeg -i input.mp4 -vf "hflip,vflip" -c:a copy output.mp4
Фильтр rotate (произвольный угол)
Фильтр rotate позволяет повернуть видео на любой угол, правда, в отличие от фильтров выше, делает он это по-другому. При поворотах без масштабирования на углы, не кратные 180 градусам, часть видео обрезается подобно тому, как это делалось с помощью проигрывателя VLC. Чтобы повернуть видео по часовой стрелке на 60 градусов, используйте следующую команду (можно поворачивать против часовой стрелки, указав минус перед числом градусов):
ffmpeg -i input.mp4 -vf "rotate=60*PI/180" -c:a copy output.mp4
Результирующее видео будет выглядеть, как на картинке ниже.
Фильтр принимает значение угла в радианах. Чтобы перевести градусы в радианы, нужно умножить градусы на дробь PI/180, где PI – предопределенное в FFmpeg число ПИ (3,14…).
Для поворота на углы, кратные 90 градусам, лучше отключить билинейную интерполяцию (параметр bilinear=0), иначе видео могут выглядеть размытыми:
ffmpeg -i input.mp4 -vf "rotate=90*PI/180:bilinear=0" -c:a copy output.mp4
Фильтр rotate очень мощный, с помощью него можно создавать даже анимированные повороты видео в соответствии с запрограммированной формулой. Например, команда ниже создаст вращающееся видео, начинающееся с угла 60 градусов (PI/3) с периодом вращения 10 секунд:
ffmpeg -i input.mp4 -vf "rotate=PI/3+2*PI*t/10" -c:a copy output.mp4
Для более глубокого ознакомления с фильтром rotate посетите соответствующий раздел официальной документации (на англ.).
Добавить комментарий