Изменить флаг поворота в видео MP4 (без потери метаданных)
Я просто хочу изменить флаг поворота в видеофайле.mp4. Существует много подобных вопросов, большинство ответов предлагают использовать
ffmpeg -i input.mp4 -map_metadata 0 -metadata:s:v rotate=90 -codec copy output.mp4
Моя проблема с этими решениями заключается в том, что, хотя он копирует большую часть метаданных, некоторые части теряются, а размер файла на 700 КБ меньше. Прилагается до и после метаданных из ffprobe и exifer.
Дополнительным странным выводом является то, что команда ffmpeg rotate=90 выполняет вращение по часовой стрелке, которое в ffprobe составляет (cw) 270° в метаданных, но (ccw)90° в сторонних данных displaymatrix.
= equal attributes
* altered attributes
- removed attributes
+ added attributes
ffprobe input.mp4
*Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\input.mp4':
= Metadata:
* major_brand : avc1
* minor_version : 0
* compatible_brands: avc1isom
= creation_time : 2016-10-29T12:10:41.000000Z
- firmware : HD3.11.03.03
* Duration: 00:00:06.01, start: 0.000000, bitrate: 32072 kb/s
= Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt709), 1920x1440 [SAR 1:1 DAR 4:3], 30945 kb/s, 47.95 fps, 47.95 tbr, 720k tbn, 95.90 tbc (default)
= Metadata:
= creation_time : 2016-10-29T12:10:41.000000Z
* handler_name : GoPro AVC
- encoder : GoPro AVC encoder
- Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
- Metadata:
- creation_time : 2016-10-29T12:10:41.000000Z
- handler_name : GoPro AAC
ffprobe output.mp4
*Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\output.mp4':
= Metadata:
* major_brand : isom
* minor_version : 512
* compatible_brands: isomiso2avc1mp41
= creation_time : 2016-10-29T12:10:41.000000Z
+ encoder : Lavf58.10.100
* Duration: 00:00:06.01, start: 0.000000, bitrate: 30948 kb/s
= Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt709), 1920x1440 [SAR 1:1 DAR 4:3], 30945 kb/s, 47.95 fps, 47.95 tbr, 720k tbn, 95.90 tbc (default)
= Metadata:
+ rotate : 270
= creation_time : 2016-10-29T12:10:41.000000Z
* handler_name : VideoHandler
+ Side data:
+ displaymatrix: rotation of 90.00 degrees
exiftool input.mp4
=ExifTool Version Number : 10.87
*File Name : input.mp4
=Directory : C:/
*File Size : 23 MB
*File Modification Date/Time : 2016:10:29 13:10:48+02:00
*File Access Date/Time : 2018:03:22 22:51:11+01:00
*File Creation Date/Time : 2018:03:22 22:51:11+01:00
=File Permissions : rw-rw-rw-
=File Type : MP4
=File Type Extension : mp4
=MIME Type : video/mp4
*Major Brand : MP4 Base w/ AVC ext [ISO 14496-12:2005]
*Minor Version : 0.0.0
*Compatible Brands : avc1, isom
=Movie Header Version : 0
=Create Date : 2016:10:29 12:10:41
=Modify Date : 2016:10:29 12:10:41
*Time Scale : 90000
=Duration : 6.01 s
=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
-Firmware Version : HD3.11.03.03
-Lens Serial Number : LW13121003000141
-Camera Serial Number Hash : 4833422b363033313530636432356400
=Track Header Version : 0
=Track Create Date : 2016:10:29 12:10:41
=Track Modify Date : 2016:10:29 12:10:41
=Track ID : 1
=Track Duration : 6.01 s
=Track Layer : 0
=Track Volume : 0.00%
=Image Width : 1920
=Image Height : 1440
=Graphics Mode : srcCopy
=Op Color : 0 0 0
=Compressor ID : avc1
=Source Image Width : 1920
=Source Image Height : 1440
=X Resolution : 72
=Y Resolution : 72
-Compressor Name : .GoPro AVC encoder
=Bit Depth : 24
-Color Representation : nclc 1 1 1
-Gamma : 2.2
=Video Frame Rate : 47.952
-Matrix Structure : 1 0 0 0 1 0 0 0 1
=Media Header Version : 0
=Media Create Date : 2016:10:29 12:10:41
=Media Modify Date : 2016:10:29 12:10:41
-Media Time Scale : 48000
-Media Duration : 5.99 s
*Handler Type : Audio Track
-Handler Description : .GoPro AAC
-Balance : 0
-Audio Format : mp4a
-Audio Channels : 2
-Audio Bits Per Sample : 16
-Audio Sample Rate : 48000
-Movie Data Size : 24045320
-Movie Data Offset : 32768
*Avg Bitrate : 32 Mbps
=Image Size : 1920x1440
=Megapixels : 2.8
*Rotation : 0
exiftool output.mp4
=ExifTool Version Number : 10.87
*File Name : output.mp4
=Directory : C:/
*File Size : 22 MB
*File Modification Date/Time : 2018:03:23 12:29:19+01:00
*File Access Date/Time : 2018:03:23 12:28:18+01:00
*File Creation Date/Time : 2018:03:23 12:28:18+01:00
=File Permissions : rw-rw-rw-
=File Type : MP4
=File Type Extension : mp4
=MIME Type : video/mp4
*Major Brand : MP4 Base Media v1 [IS0 14496-12:2003]
*Minor Version : 0.2.0
*Compatible Brands : isom, iso2, avc1, mp41
+Movie Data Size : 23232544
+Movie Data Offset : 48
=Movie Header Version : 0
=Create Date : 2016:10:29 12:10:41
=Modify Date : 2016:10:29 12:10:41
*Time Scale : 1000
=Duration : 6.01 s
=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 : 2
=Track Header Version : 0
=Track Create Date : 2016:10:29 12:10:41
=Track Modify Date : 2016:10:29 12:10:41
=Track ID : 1
=Track Duration : 6.01 s
=Track Layer : 0
=Track Volume : 0.00%
+Matrix Structure : 0 1 0 -1 0 0 0 0 1
=Image Width : 1920
=Image Height : 1440
=Media Header Version : 0
=Media Create Date : 2016:10:29 12:10:41
=Media Modify Date : 2016:10:29 12:10:41
+Media Time Scale : 720000
+Media Duration : 6.01 s
+Media Language Code : eng
+Handler Description : VideoHandler
=Graphics Mode : srcCopy
=Op Color : 0 0 0
=Compressor ID : avc1
=Source Image Width : 1920
=Source Image Height : 1440
=X Resolution : 72
=Y Resolution : 72
=Bit Depth : 24
+Pixel Aspect Ratio : 1:1
=Video Frame Rate : 47.952
*Handler Type : Metadata
+Handler Vendor ID : Apple
+Encoder : Lavf58.10.100
*Avg Bitrate : 30.9 Mbps
=Image Size : 1920x1440
=Megapixels : 2.8
*Rotation : 270
Я сравнил ffmpeg rotate=0 и rotate=90 .mp4 файлов в notepad++, чтобы определить флаг / матрицу поворота, но без везения, просто бред. Я бы предпочел просто отредактировать флаг (как exiftool делает это для всех видов метаданных, но не может вращать видео) вместо потоковой передачи содержимого в новый контейнер, также для более быстрой обработки (все видео находятся на NAS),
3 ответа
Чтобы получить истинное вращение без потерь, я не мог найти решение, поэтому я взял шестнадцатеричный редактор (например, HxD) и проанализировал повернутые видеофайлы.
- откройте mp4 с помощью шестнадцатеричного редактора и найдите
vide
найти метаданные видео дорожки - несколько строк выше (для моих файлов в основном 9, иногда 12) вы должны увидеть
trak...\tkhd
- между ними должно быть
@
знак (HEX 40) - в двух строках перед ним сохраняется матрица вращения
нет вращения:
00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40
180 °:
FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40
90 ° по часовой стрелке:
00 00 00 00 00 01 00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40
90 ° по часовой стрелке:
00 00 00 00 FF FF 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40
Измените файл так, как вам нужно, и он должен вращаться в игроках, которые поддерживают флаг вращения (большинство современных игроков делают это).
Если ваше видео содержит стереозвук, это, очевидно, не переключается, поэтому, если вы хотите, чтобы звук совпадал с поворотом видео (на 180°), вам нужно переключить левый и правый каналы.
exiftool версии 10.89 теперь поддерживает поворот видео в формате mp4 без изменения других метаданных.
Использование:
exiftool -rotation=90 video.mp4
Некоторые ответы предполагают, что для этого нельзя использовать exiftool, но в последних версиях это определенно возможно.
exiftool -rotation=0 video.mp4
При этом удаляются все флаги поворота и предполагается, что камера использовалась в нормальной (альбомной) ориентации. Это занимает около минуты, что удивительно, поскольку меняется всего пара байтов.
O:\>exiftool -ver
12.29
T:\>dir 2021*658*.mp4
Volume in drive T is temp
Volume Serial Number is 30A1-6AD0
Directory of T:\
03/06/2021 02:45 PM 327,499,207 20210306_144335-00.00.00.000-00.01.32.658.mp4
1 File(s) 327,499,207 bytes
0 Dir(s) 16,700,923,904 bytes free
T:\>exiftool -rotation=0 20210306_144335-00.00.00.000-00.01.32.658.mp4
1 image files updated
T:\>dir 2021*658*.mp4
12/07/2021 05:19 PM 327,499,207 20210306_144335-00.00.00.000-00.01.32.658.mp4
1 File(s) 327,499,207 bytes
0 Dir(s) 16,229,441,536 bytes free