web-dev-qa-db-fra.com

Rotation de vidéos mp4 sans réencodage

Je cherche un moyen de faire pivoter les vidéos tournées avec mon Nexus 4 sur mon système Debian Wheezy. Les vidéos sont tournées en mode portrait et je voudrais les faire pivoter en mode paysage. De préférence, la rotation est commandée par la ligne de commande.

J'ai trouvé plusieurs questions précédentes qui suggèrent une bonne solution, mais je n'arrive pas à réussir à la faire fonctionner.

Pour commencer, il y avait cette question: Rotation de vidéos avec FFmpeg

Mais cela indique que ffmpeg est obsolète et que je devrais utiliser avconv. J'ai trouvé cette question détaillant la voie à suivre. https://askubuntu.com/questions/269429/how-can-i-rotate-video-by-180-degrees-with-avconv

Cela m'a fait utiliser la commande suivante:

avconv -i original.mp4 -vf "transpose=1" -codec:v libx264 -preset slow -crf 25 -codec:a copy flipped.mp4

Cependant, ceci est laborieusement lent (le dernier test m'a pris plus de 6 heures pour moins de 3 minutes de métrage) et ne donne pas un film lisible. Je reçois également une erreur lors de la consignation de la sortie qui indique Mb Rate> level limit.

Y at-il un problème ici avec le ré-encodage? Devrais-je d'abord ré-encoder les vidéos de mon téléphone sur un autre, un encodage plus "réalisable" avant d'appliquer les rotations? Ou est-ce que je manque un autre point important?

68
stedes

Si vous souhaitez simplement modifier les métadonnées de manière à ce que les lecteurs multimédia prenant en compte l'indicateur lisent le fichier pivoté, essayez l'une des solutions suivantes:

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=90 output.mp4

comme trouvé ailleurs sur stackoverflow .

98
ruediger05

Rotation = 0 corrigé mon problème. J'ai commencé à enregistrer des vidéos en mode portrait, j'ai réalisé mon erreur et immédiatement transformé mon téléphone en paysage pour continuer l'enregistrement. Mon iphone avait marqué la vidéo comme portrait pour toute la vidéo.

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=0 output.mp4

Fixe le.

46
Mangor

FFmpeg et programmes similaires change les métadonnées même avec le -map_metadata option. exiftool peut lire la matrice de rotation et l'indicateur de rotation, mais ne peut pas l'écrire.

Pour obtenir une véritable rotation sans perte (y compris les métadonnées), je ne pouvais pas trouver de solution. J'ai donc saisi un éditeur hexadécimal (par exemple, HxD ) et analysé les fichiers vidéo faisant l'objet d'une rotation.

Véritable rotation sans perte de MP4:

  • ouvrez mp4 avec l'éditeur hexadécimal et recherchez vide pour trouver les métadonnées de la piste vidéo
  • certaines lignes ci-dessus (pour mes fichiers principalement 9, parfois 12), vous devriez voir trak...\tkhd
  • entre les deux, il devrait y avoir un @ signe (HEX 40)
  • dans les deux lignes qui précèdent la matrice de rotation est stockée
  • pas de rotation:

    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 ° cw:

    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 ° ccw:

    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
    

Modifiez le fichier selon vos besoins et faites-le pivoter auprès des lecteurs prenant en charge le drapeau de rotation (la plupart des lecteurs actuels le font).

Si votre vidéo contient de l'audio stéréo, cette option n'est évidemment pas activée. Par conséquent, si vous souhaitez que le son corresponde à la rotation de la vidéo (180 °), vous devez activer les canaux gauche et droit.

20
aXeL-HH

Vous avez abordé plusieurs points dans votre question:

  1. Il n’ya pratiquement aucune chance que vous puissiez faire la rotation sans réencodage. L'exception à cette règle (codec MJPEG) a déjà été signalée, mais il est peu probable que vous l'utilisiez. Elle dépasse donc le cadre de cette question. Je vais mentionner que la raison de cette capacité est que JPEG peut être converti via des métadonnées. Ainsi, si vous parvenez à trouver un conteneur avec la rotation des métadonnées, vous pourrez effectuer une rotation, mais aucun n'existe (ou est suffisamment étendu) jusqu'à présent.
  2. S'il vous a fallu des heures pour faire pivoter et recoder 3 minutes de la vidéo, le problème peut alors se poser sur une résolution énorme. Et je veux dire énorme! Pouvez-vous s'il vous plaît fournir la sortie de la avprobe original.mp4 afin qu'il puisse être vérifié.
  3. Les débats entre Libav et FFmpeg sont très contre-productifs (vous pouvez le voir par la quantité de fud affichée ici déjà). Fondamentalement, ce qui est arrivé est une scission du projet avec quelques développeurs qui vont d'une manière et d'une autre, le fait que le projet FFmpeg ait réussi à conserver le nom n'est qu'un hasard et qu'il est insensé d'appeler un projet original et un autre un fork. Les différences entre les projets concernent principalement le style de développement et la philosophie. Si vous qualifiez FFmpeg de plus en plus Open Source et Libav de plus en plus de logiciels libres, vous ne vous tromperez pas. Les personnes rationnelles espèrent que les développeurs finiront par reprendre leur sens et ne fusionneront peut-être pas les projets mais coopéreront dans une plus large mesure. Quand Ubuntu est sorti, à l'origine, sur chaque discussion Debian GNU/Linux, il y avait d'énormes messages du type "Ubuntu n'est pas une Debian !!!!!!!", mais la situation s'est maintenant calmée et les deux parties en sont satisfaites. un autre.
3
v010dya

Cette réponse est simplement un résumé des commentaires fournis par LordNeckbeard.

Rotation sans encodage

La rotation sans réencodage n'est possible que si:

  • votre entrée est MJPEG
  • vous faites pivoter lors de la lecture

Rotation avec encodage en utilisant le ffmpeg correct

Pour bien comprendre les étapes nécessaires à cela, il faut commencer par lire ou au moins survoler cette question:

Quelles sont les différences et les similitudes entre ffmpeg, libav et avconv?

Résumé: avconv est un fork de ffmpeg, le responsable Debian a choisi avconv, vous devez compiler le ffmpeg correct à partir du source.

La prochaine étape serait de compiler le ffmpeg correct à partir de la source, comme détaillé ici:

Guide de compilation de ffmpeg pour Debian

La dernière étape consiste à utiliser les commandes trouvées dans d’autres publications:

Comment retourner une vidéo à 180 ° (verticale/à l'envers) avec FFmpeg? ou Rotation de vidéos avec FFmpeg

Résumé: ffmpeg -vfilters "rotate = 90" -i input.mp4 output.mp4

1
stedes