Работа с видео

Почему видео воспроизводится боком и почему исправление занимает полсекунды

Камера телефона всегда пишет горизонтальный кадр и оставляет плееру 11-байтовую пометку о повороте. Если пометка теряется, видео ложится на бок. Что это за пометка, кто её теряет и почему исправление не трогает ни одного пикселя.

Коротко

Матрица камеры закреплена в корпусе телефона в горизонтальном положении. Когда вы снимаете, держа телефон вертикально, матрица всё равно записывает горизонтальный кадр, а телефон просто добавляет в файл флаг «показывать с поворотом на 90°». Все плееры на телефоне этот флаг учитывают. Некоторые программы в других местах (старые редакторы, отдельные веб-плееры, некоторые системы обработки загрузок) его игнорируют или удаляют, и видео воспроизводится лёжа на боку. Вернуть флаг на место можно правкой метаданных: она занимает долю секунды при любом размере файла и ничего не перекодирует.

Что это за флаг на самом деле

Файл MP4 или MOV устроен как дерево блоков. Блок, описывающий отображение видеодорожки, называется tkhd (track header), и в нём хранится матрица преобразования 3 × 3: девять чисел, 36 байт, которые плеер применяет к каждому кадру перед выводом. Для видео без поворота это единичная матрица. Для видео, снятого на вертикально поднятый телефон, это поворот на 90°. Пиксели в файле горизонтальные, матрица говорит «поверни их». Android записывает ту же информацию отдельным значением rotation; ffmpeg показывает оба варианта как rotate: 90 в метаданных потока.

Так устроено намеренно. Поворачивать сами пиксели при записи означало бы прогонять каждый кадр через кодировщик ещё раз, причём от батареи. Записать девять чисел ничего не стоит. Та же логика лежит в основе ориентации EXIF у фотографий, и ломается она так же: любая программа, которая не читает тег, показывает исходную ориентацию.

Кто его теряет

  • Старые настольные редакторы и плееры, написанные до того, как телефоны стали снимать вертикальное видео. VLC и QuickTime учитывают матрицу уже много лет; некоторые корпоративные видеосистемы и старые сборки Windows Media Player нет.
  • Транскодеры, которые копируют видеопоток, но пересобирают контейнер. Программа с обещанием «без перекодирования, без потерь» может всё равно записать новый tkhd с единичной матрицей. Пиксели сохраняются, инструкция нет.
  • Некоторые сайты при загрузке. Сайт, который при загрузке переупаковывает файл, может потерять тег; сайт, который перекодирует, обычно корректно впекает поворот в кадр.
  • Склейка. Если соединить вертикальный и горизонтальный ролики в один файл, у общей дорожки останется одна матрица, и одна из двух половин будет повёрнута неправильно.

Два способа исправить, один из них бесплатный

Переписать матрицу. Установите в матрице tkhd (или в поле поворота) значение, при котором видео отображается правильно. Это запись нескольких десятков байтов в файл, который может весить гигабайты; видео- и аудиопотоки копируются без изменений. Полсекунды, без потери качества, тот же размер файла. Именно это по умолчанию делает Поворот видео: читает файл на вашем устройстве, записывает исправленный заголовок и отдаёт файл обратно. Поскольку ничего не декодируется, запись на 4 ГБ обрабатывается так же быстро, как файл на 4 МБ.

Перекодировать с впечённым поворотом. Декодировать каждый кадр, повернуть пиксели, закодировать снова. Это нужно, только когда точно известно, что программа-получатель игнорирует матрицу, а заменить её нельзя: плеер цифровых вывесок, устаревшая CMS. Это занимает столько же времени, сколько длится видео (или дольше без аппаратного кодировщика), и даёт одно поколение потери качества. Поворот видео предлагает этот способ вторым вариантом, используя кодировщик WebCodecs из браузера, и прямо пишет об этом в интерфейсе, потому что этот путь затратный.

Почему «бесплатное» исправление иногда не работает

Если видео идёт боком в одной программе, а в остальных правильно, эта программа игнорирует матрицу, и переписывание не поможет; поможет только впекание поворота. Если видео идёт боком везде, матрица потерялась, и её переписывание решит проблему. Быстрая проверка: откройте файл в актуальном браузере (Chrome, Safari и Firefox учитывают тег). Боком в браузере → матрица неверна или отсутствует → перепишите её. Правильно в браузере, боком в другой программе → проблема в программе → впеките поворот.

Похожие ловушки

  • Миниатюры. Кадр, взятый из видео, которое идёт боком, тоже выходит боком, потому что изображение берётся из потока, а не с экрана. Сначала исправьте видео, затем берите кадр.
  • Обрезка. Обрезка без перекодирования сохраняет матрицу; обрезка программой, которая переупаковывает файл, может её потерять. Если обрезанный ролик вернулся лёжа на боку, программа обрезки потеряла тег, и переписывание матрицы вернёт его на место.
  • Зеркальное видео с фронтальной камеры. Это другой флаг (горизонтальное отражение в той же матрице), и исправляется он так же.
Озвучка текстаTextToSpeech.tools Сжать видеоFreeCompress.video Китайско-английский словарьChineseDict.com