видео, снятое с iphone, поворачивается при конвертации в .mp4 с помощью ffmpeg - PullRequest
19 голосов
/ 23 февраля 2012

Когда я пытаюсь загрузить видео, снятые с моего iPhone, в мое приложение, сервер выполняет преобразование из .mov в .mp4, чтобы его можно было воспроизводить на других платформах.Однако проблема заключается в том, что когда я снимаю видео (в портретной ориентации), оно конвертируется (с помощью ffmpeg) и затем воспроизводится с сервера, оно кажется повернутым.Есть идеи?

Ответы [ 9 ]

28 голосов
/ 17 июня 2015

FFMPEG изменил поведение по умолчанию для автоматического поворота видеоисточников с метаданными поворота в 2015 . Это было выпущено как v2.7.

Если ваша версия ffmpeg v2.7 или новее, но ваши метаданные ротации не соблюдаются, проблема, вероятно, заключается в том, что вы используете нестандартную ротацию на основе метаданных. Это приведет к тому, что одна и та же логика будет применена дважды, изменяя или отменяя вращение.

Помимо удаления пользовательского поворота (рекомендуется), есть возможность отключить автоповорот с помощью -noautorotate.

ffmpeg -noautorotate -i input.mp4 ...

Это также будет работать в некоторых старых версиях.

19 голосов
/ 18 декабря 2012

Что вы также можете сделать, это удалить определенные метаданные QuickTime при повороте .mov.Это гарантирует, что видео вращается одинаково в VLC и QuickTime

ffmpeg -i in.mov -vf "transpose=1" -metadata:s:v:0 rotate=0 out.mov

Вот документация по опции -metadata (от http://ffmpeg.org/ffmpeg.html):

-metadata[:metadata_specifier] key=value (output,per-metadata)

Установите пару ключ / значение метаданных.

Может быть задан необязательный спецификатор metadata_specifier для установки метаданных в потоках или главах. Подробнее см. Документацию -map_metadata.

Этот параметр переопределяет набор метаданных с -map_metadataТакже возможно удалить метаданные, используя пустое значение.

Например, для установки заголовка в выходном файле:

 ffmpeg -i in.avi -metadata title="my title" out.flv 

Чтобы установить язык первого аудиопотока:

 ffmpeg -i INPUT -metadata:s:a:1 language=eng OUTPUT
18 голосов
/ 24 февраля 2012

Для полноты картины это происходит из-за того, что iPhone фактически захватывает видео только в одной фиксированной ориентации. Измеренная ориентация затем записывается в специфичные для Apple метаданные.

В результате Quicktime Player считывает метаданные и поворачивает видео в правильную ориентацию во время воспроизведения, а другое программное обеспечение (например, VLC) - нет, и показывает его как ориентированное в реальных данных кодека.

Вот почему rotate=90 (или vflip, или transpose, и т. Д.) Будут работать для некоторых людей, но не для других. В зависимости от того, как камера удерживается во время записи, необходимое вращение может составлять 90, 180 или даже 270 градусов. Не читая метаданные, вы просто угадываете, сколько вращения необходимо, и изменение, исправляющее одно видео, не удастся для другого.

9 голосов
/ 23 февраля 2012

В зависимости от того, какая у вас версия ffmpeg и как она скомпилирована, должно работать одно из следующих ...

ffmpeg -vfilters "rotate=90" -i input.mov output.mp4

... или ...

ffmpeg -vf "transpose=1" -i input.mov output.mp4
6 голосов
/ 09 декабря 2012

Использовать фильтр vflip

ffmpeg -i input.mov -vf "vflip" output.mp4

Поворот не работает для меня, и transpose = 1 вращается на 90 градусов

4 голосов
/ 24 ноября 2013

Итак - я тоже столкнулся с этой проблемой, и вот мои $ 0,02 по ней:

1.) Некоторые видео имеют метаданные ориентации / поворота, некоторые нет: MTS (Sony AVHCD) или AVIУ меня есть - не иметь тег ориентации.MOVs и MP4 (ipad / iphone или samsung galaxy note2) ДЕЛАЮТ это.

you can check the setting via 'exiftool -Rotation file'.
My videos often have 90 or 180 as the rotation.

2.) Ffmpeg - независимо от man-страницы с тегом метаданных, просто НИКОГДА не устанавливаетсяэто в выходном файле.- тег поворота ВСЕГДА '0'.он правильно сообщает об этом в выходных данных, но exiftool никогда не устанавливает права на его получение.- Но эй - по крайней мере, он есть и всегда 0.

3.) Углы поворота: если вы хотите повернуть +/- 90: переместите = 1 для часовой стрелки 90, 2 по часовой стрелке сейчас, если вам нужно 180 градусов - простодобавить этот фильтр ДВАЖДЫ.помните - это указанная вами цепочка фильтров.:-) - см. ниже.

4.) поверните, а затем масштабируйте: это сложно - потому что вы быстро получаете нарушения формата вывода MP4.Допустим, у вас есть MOV 1920x1080.Поворот на 90 дает 1080x1920, затем мы изменяем масштаб до -1: 720 -> 1080 * (720/1920) = 405 по горизонтали, а по горизонтали 405 НЕ делится на 2 - ОШИБКА.исправить это вручную.ИСПРАВЛЕНИЕ ЭТОГО автоматически - требует немного работы сценария оболочки.

5.) Масштабируйте и поворачивайте: вы можете сделать это таким образом - но тогда вы получите 720x1280.Тьфу.Но вот пример фильтра: "-vf yadif = 1, scale = -1: 720, transpose = 1" Это просто не то, что я хочу - но может работать вполне нормально.

Собираем все вместе: - ПРИМЕЧАНИЕ - «намеренно НЕПРАВИЛЬНЫЙ Rotation-tag», просто чтобы продемонстрировать - он не будет отображаться ВСЕХ в выводе!Это возьмет ввод - и повернет его на 180 градусов , ПОТОМ СБРОСИТЕ ЭТО - сбросьте метку вращения.- обычно iphone / ipad2 может создавать вращающийся на 180 градусов материал.вы можете просто оставить '-metadata Rotation = x' вне строки ...

/ usr / bin / ffmpeg -i input-movie.mov -timestamp 2012-06-23 08:58:10 -map_metadataВращение метаданных 0: 0 = 270 -sws_flags lanczos -vcodec libx264 -x264 открывает me = umh -b 2600k -vf yadif = 1, транспонировать = 1, транспонировать = 1, масштабировать = 1280: 720 -f mp4-y output-movie.MP4

У меня есть несколько устройств - например, приставка, ipad2, note2, и я преобразую ВСЕ свой входной материал (независимо от того, является ли он mp4, mov, MTS, AVI) в 720p mp4и до сих пор ВСЕ получающиеся видео воспроизводятся правильно (ориентация, звук) на каждом устройстве.

Надеюсь, это поможет.

0 голосов
/ 05 апреля 2018

Хотя тема старая.Надеюсь, это поможет кому-то:

Получить последнюю версию ffmpeg: https://www.ffmpeg.org/download.html

Команда, которая работала для меня (перевернуть на 180 градусов):

ffmpeg -noautorotate -i input.mp4 -filter:v "rotate=PI" output.mp4

Когдаградусы определяются как -filter:v "PI/180*degrees"

, например -filter:v "45*PI/180" для 45 градусов

Хорошее объяснение здесь https://superuser.com/questions/578321/how-to-rotate-a-video-180-with-ffmpeg

0 голосов
/ 11 апреля 2017

Я снимал видео с Ipad3, и оно было перевернуто вверх дном, что, как я полагаю, является обычной ситуацией для всех устройств Apple в некоторых версиях. Кроме того, 3-минутный файл MOV (1920x1090) занимал около 500 МБ, что делало его недоступным для совместного использования. Мне пришлось преобразовать его в MP4 и, проанализировав все потоки, которые я нашел в stackoverflow, вот последняя строка кода для ffmpeg, которую я использовал (ffmpeg ver. 2.8.4):

ffmpeg -i IN.MOV -s 960x540 -metadata:s:v rotate="0" -acodec libmp3lame OUT.mp4

Полагаю, вы можете просто оставить '-metadata: s: v rotate = "0"', если вам не нужно изменять размеры и менять аудиокодек. Обратите внимание, что при изменении размера видео ширина и высота должны быть полностью разделены до 4.

0 голосов
/ 28 июля 2015

Для включения в веб-страницы моих видео в формате портрета с iPhone я обнаружил следующий рецепт получения файлов .mp4 в портретном режиме.

Шаг 1. В QuickTime Player экспортируйте файл в формат 480p (Я предполагаю, что 720p или 1080p также будут работать).Вы снова получаете файл .mov.

Шаг 2: Возьмите новый файл в QT Player и экспортируйте в «iPad, iPhone…».Вы получаете файл .m4v.

Шаг 3: Я использую Miro Video Converter, но, вероятно, любой готовый конвертер вообще сработает, чтобы получить ваш файл .mp4.

Работаеткак (многословный) шарм.

...