Как удалить или отредактировать Exif из mp4 видео? - PullRequest
23 голосов
/ 11 августа 2011

Я записал видео в формате Full HD на Samsung Galaxy II, когда я загрузил его на YouTube, я обнаружил, что он повернулся на 90 градусов, как портретная компоновка 1080x1920, а не 1920x1080. Я нашел причину проблемы:

YouTube читает метаданные видео и вращает видео в формате Exif ориентация перед кодированием

Это отчет ExifTool (см. Последний тег «Вращение»): ExifTool Version Number : 8.61 File Name : video.mp4 Directory : . File Size : 217 MB File Modification Date/Time : 2011:08:11 00:47:23+04:00 File Permissions : rw-rw-rw- File Type : 3GP MIME Type : video/3gpp Major Brand : 3GPP Media (.3GP) Release 4 Minor Version : 0.3.0 Compatible Brands : 3gp4, 3gp6 Movie Data Size : 227471371 Movie Header Version : 0 Create Date : 1900:01:00 00:00:00 Modify Date : 1900:01:00 00:00:00 Time Scale : 1000 Duration : 0:01:46 Preferred Rate : 1 Preferred Volume : 100.00% Preview Time : 0 s Preview Duration : 0 s Poster Time : 0 s Selection Time : 0 s Selection Duration : 0 s Current Time : 0 s Next Track ID : 3 Track Header Version : 0 Track Create Date : 1900:01:00 00:00:00 Track Modify Date : 1900:01:00 00:00:00 Track ID : 1 Track Duration : 0:01:46 Track Layer : 0 Track Volume : 0.00% Image Width : 1920 Image Height : 1080 Graphics Mode : srcCopy Op Color : 0 0 0 Compressor ID : avc1 Source Image Width : 1920 Source Image Height : 1080 X Resolution : 72 Y Resolution : 72 Bit Depth : 24 Video Frame Rate : 30.023 Matrix Structure : 1 0 0 0 1 0 0 0 1 Media Header Version : 0 Media Create Date : 1900:01:00 00:00:00 Media Modify Date : 1900:01:00 00:00:00 Media Time Scale : 16000 Media Duration : 0:01:46 Handler Type : Audio Track Handler Description : SoundHandler Balance : 0 Audio Format : mp4a Audio Channels : 1 Audio Bits Per Sample : 16 Audio Sample Rate : 16000 Play Mode : SEQ_PLAY Avg Bitrate : 17.1 Mbps Image Size : 1920x1080 Rotation : 90

Как удалить все данные Exif или просто изменить свойство Rotation?

Ответы [ 2 ]

42 голосов
/ 18 ноября 2011

Mp4-файлы (и многие другие) используют стандарт MPEG-4 , который размещает данные внутри него в маленькие прямоугольники, называемые атомами.Вы можете найти отличное описание атомов на этой странице .Короче говоря, атомы организованы в древовидную структуру, где атом может быть либо родителем других атомов, либо контейнером данных, но не обоими (хотя некоторые люди нарушают это правило)

В частности, атомвы ищете называется "тхд" (трек заголовок).Вы можете найти список атомов здесь .

Внутри этого атома вы найдете метаданные видео.Структура атома "tkhd" указана здесь

Наконец, фрагмент метаданных, который вам нужен (который не является атомом), называется "Матричная структура".От developer.apple.com :

Все значения в матрице являются 32-разрядными числами с фиксированной запятой, разделенными на 16,16, за исключением столбца {u, v, w}, который содержит 32-разрядные числа с фиксированной запятой, разделенные на 2,30.

Это показано на следующем рисунке:

Матрица 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 за помощь и замечательный софт)

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

В моем случае изменение exif-данных не решило проблему, потому что это на самом деле правильно.Проблема состоит в том, что большинство игроков игнорируют это (то есть они предполагают, что это 0).

Если вы хотите поиграть с exif-тегом Rotation, вы можете управлять им с помощью MediaRecorder.setOrientationHint ().Это гораздо проще, чем модифицировать его по факту.Если загрузчик YouTube уважает тег, то это все, что вам нужно.

Но единственное решение, которое я нашел, - это вращать само видео или использовать подсказки пользовательского интерфейса, чтобы направлять пользователей для записи видео в естественном виде камерыориентация.

В Android нет встроенного механизма поворота видео.

...