web-dev-qa-db-fra.com

Comment supprimer ou modifier Exif de la vidéo mp4?

J'ai enregistré une vidéo Full HD avec le Samsung Galaxy II. Lorsque je l'ai téléchargée sur YouTube, j'ai constaté qu'elle tournait à 90 degrés, comme dans la disposition Portrait 1080x1920 et NON 1920x1080. J'ai trouvé la cause du problème:

YouTube lit les métadonnées de la vidéo et fait pivoter la vidéo selon l'orientation Exif avant l'encodage

Ceci est un rapport ExifTool (veuillez voir la dernière balise "Rotation"):


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

Comment puis-je supprimer des données Exif entières ou simplement modifier la propriété Rotation?

22
Exey Panteleev

Les fichiers Mp4 (et bien d’autres) utilisent le standard MPEG-4 , qui organise les données qu’il contient dans de petites boîtes appelées atomes. Vous pouvez trouver une excellente description des atomes dans cette page Page . En bref, les atomes sont organisés sous forme d'arborescence, un atome pouvant être le parent d'autres atomes ou un conteneur de données, mais pas les deux (bien que certaines personnes ne respectent pas cette règle).

En particulier, l'atome que vous recherchez s'appelle "tkhd" (en-tête de piste). Vous pouvez trouver une liste d'atomes ici

Dans cet atome, vous trouverez les métadonnées de la vidéo. La structure de l’atome "tkhd" est spécifiée ici

Enfin, le bloc de métadonnées dont vous avez besoin (qui n'est pas un atome) s'appelle "Structure matricielle". De developer.Apple.com

Toutes les valeurs de la matrice sont des nombres à virgule fixe de 32 bits divisés en 16.16, à l'exception de la colonne {u, v, w}, qui contient des nombres à virgule fixe de 32 bits divisés en 2,30.

Ceci est montré dans l'image suivante:

"Matrix Structure" a transformation matrix

La matrice de 9 octets commence dans l'octet 48 de l'atome "tkhd". Un exemple de "structure matricielle" pour une orientation de 0 ° serait 1 0 0 0 1 0 0 0 1 (la matrice d'identité)

ALORS!

Après tout, vous avez besoin de modifier cette matrice. Le paragraphe suivant est extrait de developer.Apple.com

Une matrice de transformation définit comment mapper des points d'un espace de coordonnées Vers un autre espace de coordonnées. En modifiant le contenu d'une matrice de transformation , Vous pouvez effectuer plusieurs opérations d'affichage graphique Standard, notamment la traduction, la rotation et la mise à l'échelle. La matrice Utilisée pour effectuer les transformations bidimensionnelles est décrite Mathématiquement par une matrice 3-sur-3.

Cela signifie que la matrice de transformation définit une fonction qui mappe chaque coordonnée en une nouvelle.

Comme il vous suffit de faire pivoter l'image, il vous suffit de modifier la matrice 2 x 3 la plus à gauche, définie par les octets 0, 1, 3, 4, 6 et 7.

Voici les 2 x 3 matrices que j'utilise pour représenter chaque orientation (valeurs 0, 1, 3, 4, 6 et 7 de la matrice 3x3):

0 °: (x ', y') = (x, y)
dix
0 1
0 0

90 °: (x ', y') = (hauteur - y, x)
0 1
-dix
hauteur 0

180 °: (x ', y') = (largeur - x, hauteur - y)
-dix
0 -1
largeur hauteur

270 °: (x ', y') = (y, largeur - x)
0 -1
dix
0 largeur

Si vous ne les avez pas, la largeur et la hauteur peuvent être obtenues juste après la structure de la matrice. Ce sont également des nombres à virgule fixe de 4 octets (16.16).

Il est fort probable que vos métadonnées vidéo contiennent la matrice 90 ° 

(Merci à Phil Harvey, créateur de Exiftool pour son aide et son merveilleux logiciel)

40
ignacio.munizaga

Dans mon cas, changer les données exif n'a pas résolu le problème, car il est correct. Le problème est que la plupart des joueurs l’ignorent (c’est-à-dire qu’ils supposent que c’est 0). 

Si vous souhaitez jouer avec le tag Rotation exif, vous pouvez le contrôler via MediaRecorder.setOrientationHint (). C'est beaucoup plus facile que de le modifier après coup. Si le téléchargeur YouTube respecte le tag, c'est tout ce dont vous avez besoin.

Mais la seule solution que j'ai trouvée consiste à faire pivoter la vidéo elle-même ou à utiliser des astuces de l'interface utilisateur pour aider les utilisateurs à enregistrer la vidéo dans l'orientation 0 naturelle de la caméra.

Il n'y a pas de mécanisme intégré pour la rotation de vidéos dans Android.

0
tennessee sombrero