Поворот MP4-видео с помощью FFmpeg

В опубликованной ранее статье "Обнуление тега ориентации в 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

Результирующее видео будет выглядеть, как на картинке ниже.

Поворот видео на 60 градусов в FFmpeg

Фильтр принимает значение угла в радианах. Чтобы перевести градусы в радианы, нужно умножить градусы на дробь 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 посетите соответствующий раздел официальной документации (на англ.).

Оцените статью: Ужасная!ПлохаяТак себеХорошаяОтличная! 5,00 из 5 (голосов: 2)
Опубликовано в Windows

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

* Представьтесь, пожалуйста! Авторизуйтесь через:

Facebook

ВКонтакте