Mp4-файлы (и многие другие) используют стандарт MPEG-4 , который размещает данные внутри него в маленькие прямоугольники, называемые атомами.Вы можете найти отличное описание атомов на этой странице .Короче говоря, атомы организованы в древовидную структуру, где атом может быть либо родителем других атомов, либо контейнером данных, но не обоими (хотя некоторые люди нарушают это правило)
В частности, атомвы ищете называется "тхд" (трек заголовок).Вы можете найти список атомов здесь .
Внутри этого атома вы найдете метаданные видео.Структура атома "tkhd" указана здесь
Наконец, фрагмент метаданных, который вам нужен (который не является атомом), называется "Матричная структура".От developer.apple.com :
Все значения в матрице являются 32-разрядными числами с фиксированной запятой, разделенными на 16,16, за исключением столбца {u, v, w}, который содержит 32-разрядные числа с фиксированной запятой, разделенные на 2,30.
Это показано на следующем рисунке:
![](https://i.stack.imgur.com/tW0De.gif)
Матрица 9 байтовначинается в байте 48 атома "тхд".Примером «матричной структуры» для ориентации 0 ° будет 1 0 0 0 1 0 0 0 1 (единичная матрица)
SO!
После всего того, что вынужно изменить эту матрицу.Следующий параграф взят из developer.apple.com :
Матрица преобразования определяет, как отображать точки из одного координатного пространства в другое координатное пространство.Изменяя содержимое матрицы преобразования, вы можете выполнять несколько стандартных операций графического отображения, включая перемещение, вращение и масштабирование.Матрица, используемая для выполнения двумерных преобразований, математически описывается матрицей 3 на 3.
Это означает, что матрица преобразования определяет функцию, которая отображает каждую координату в новую.
Поскольку вам нужно только повернуть изображение, просто измените самую левую матрицу 2 x 3, которая определяется байтами 0, 1, 3, 4, 6 и 7.
Вотматрицы 2 x 3, которые я использую для представления каждой ориентации (значения 0, 1, 3, 4, 6 и 7 матрицы 3x3):
0 °: (x ', y') = (x, y)
1 0
0 1
0 0
90 °: (x', y ') = (высота - y, х)
0 1
-1 0
высота 0
180 °: (x ', y') = (widht - x, высота - y)
-1 0
0 -1
ширина высота
270 °: (x ', y') = (y, ширина - x)
0 -1
1 0
0 width
Если у вас их нет, ширина и высота могут быть получены сразу после структуры матрицы.Они также являются числами с фиксированной точкой 4 байта (16,16).
Вполне вероятно, что ваши метаданные видео содержат матрицу 90 °
(Спасибо Филу Харви, создателю Exiftool за помощь и замечательный софт)