Comment faire pour que Handbrake préserve le temps de capture / temps de création?


14

Le frein à main est un outil de compression vidéo génial, mais il ne semble pas conserver le temps de capture d'origine après la compression d'une vidéo. Une idée de comment résoudre ce problème?


@slhck Oui, je veux dire le temps de création. J'utilise Lightroom pour gérer mes vidéos et après compression, l'heure de capture / création devient l'heure modifiée.
pixelfreak

Réponses:


21

Vous pouvez copier les métadonnées existantes d'un fichier à un autre sans avoir besoin de recoder la vidéo à l'aide de FFmpeg . Cela prend essentiellement une seconde. Pour ce faire, supposons trois fichiers:

  • in.mp4 - le fichier d'origine avant conversion
  • out.mp4 - le fichier après la conversion du frein à main
  • fixed.mp4 - le fichier avec les métadonnées "corrigées"

La commande FFmpeg pour copier l'enregistrement de métadonnées complet dans le nouveau fichier serait alors:

ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4

Explication de la syntaxe:

Pour le décomposer, cela fait ce qui suit:

  • Prenez deux fichiers d'entrée ( in.mp4et out.mp4), auxquels sont attribués les ID 0 et 1, respectivement.
  • Mappez uniquement les flux vidéo / audio / sous-titres du fichier 1 à la sortie ( -map 1), nous prenons donc les flux binaires déjà convertis
  • Mappez uniquement les métadonnées du fichier 0 à la sortie ( -map_metadata 0)
  • Utilisez le codec de copie ( -c copy) pour copier tous les flux binaires au lieu de ré-encoder la vidéo.

Après cela, vous pouvez renommer évidemment fixed.mp4à out.mp4.


Preuve:

À titre d'exemple, voici une partie de l'enregistrement de métadonnées de mon fichier d'origine:

$ mediainfo in.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19

Voici le fichier après la conversion du frein à main:

$ mediainfo out.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-12-24 11:39:35

Voici le fichier final après avoir mappé les métadonnées:

$ ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
[…]

$ mediainfo fixed.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19    

Si vous voulez tout faire avec FFmpeg:

En fait, vous n'avez pas vraiment besoin d'utiliser le frein à main si vous pouvez utiliser FFmpeg, sur lequel Handbrake s'appuie de toute façon. Dans le cas le plus simple, vous pouvez effectuer votre conversion comme ceci:

ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a aac -map_metadata 0 out.mp4

Cela convertira l'entrée avec l'encodeur x264 et l'audio AAC en un fichier de sortie, en copiant les métadonnées d'origine. Afin de modifier la qualité de la sortie, vous pouvez:

  • Modifiez la valeur CRF pour la vidéo. Plus bas signifie une meilleure qualité. 23 est la valeur par défaut, et tout ce qui est inférieur à 18 sera probablement sans perte visuelle.
  • Modifiez le débit binaire pour l'audio. Voir le guide de codage AAC pour plus d'informations.

Lisez le guide d'encodage x264 sur le wiki FFmpeg pour en savoir plus.


1
Wow, c'est une solution de contournement sympa, mais cela semble un peu intimidant, je souhaite que Handbrake fasse cela en arrière-scène. Merci!
pixelfreak

La commande de transfert de métadonnées fonctionne, mais la dernière commande pour effectuer la conversion m'a également donné une Unknown encoder 'libfaac'erreur
pixelfreak

Ensuite, votre ffmpeg n'est pas compilé avec le support FAAC. Essayez -c:a aac -strict experimentalplutôt.
slhck

5

Malheureusement, il semble que le frein à main ne puisse pas le faire seul, mais de la même manière que dans l'exemple ffmpeg, les horodatages peuvent être copiés à partir de l'original après compression en utilisant la touchcommande unix:

touch -r MVI_1234.MOV compressed_MVI_1234.m4v

cela définira l'horodatage du fichier compressé sur le même que le fichier de référence donné.


1
Il définira l'horodatage du fichier, oui, mais uniquement dans le système de fichiers. Les données EXIF ​​n'auront pas le bon horodatage "Date / Heure Original".
Stephen Schrauger du

3

J'ai trouvé un moyen plus facile de le faire, en utilisant un autre logiciel appelé Adapter: http://www.macroplant.com/adapter/

Il n'a pas tous les paramètres avancés comme HandBrake mais il fait le travail (en utilisant également ffmpeg) et conserve les métadonnées dont j'ai besoin.


1
Je ne pense pas que l'adaptateur soit capable de le faire. Je viens de tester la dernière version et je ne trouve nulle part le paramètre de conservation des métadonnées. De plus, il ne semble pas convertir tous les types de fichiers vidéo, tels que MTS, etc.
jjj

dommage qu'il ne soit pas compatible avec le format m2ts de sony
Diego Vieira

2

J'utilise macOS Yosemite et HandBrakeBatch - utilisez-le pour convertir des fichiers, mais cliquez sur la case "conserver les dates de création et de modification des fichiers" dans le menu "Préférences".

Ensuite, j'importe les vidéos dans Lightroom 5, mais elles ne conservent toujours pas les dates de création. Mais, plus important encore, les fichiers sont affichés dans le Finder avec la date de création correcte. Je les ai donc tous sélectionnés dans la bibliothèque Lightroom → Métadonnées (colonne de dialogue de droite) → Heure de capture → Changer la date de création du fichier → Tout changer.

J'ai eu 850 vieilles vidéos de famille - j'ai dû faire ce processus par lots de 100. Frein à main se bloque avec beaucoup de fichiers.


Belle trouvaille, je me vois beaucoup utiliser cette application.
calum_b

Notez que l'application n'est plus maintenue : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck

1

J'ai fait un script bash qui peut transférer par lots les métadonnées, en utilisant touchcomme suggéré ci-dessus. Pour que cela fonctionne, vous devez avoir vos fichiers originaux et convertis dans des répertoires séparés, chacun avec le même nombre de fichiers (les répertoires ne doivent avoir que les fichiers vidéo, car d'autres fichiers / répertoires interféreront) et dans le même ordre. Ensuite, il copie simplement les métadonnées et tout est prêt. Le script répertorie toutes les paires de fichiers afin que vous puissiez vérifier les erreurs à la fin si vous le souhaitez.

Le code n'est peut-être pas le plus soigné car c'était mon premier bon script bash, mais il a été assez rapide et stable pour moi, alors voici:

#!/bin/bash
#Sets IFS to \n to allow for filenames with spaces
IFS=$'\n'

#Source directory and converted direcotry
dir1=$1
dir2=$2

#Array with source filepaths
srcf=()
#Array with converted filepaths
cnvf=()

#Adds filepaths from the source directory to srcf array
for file in $(ls -1 $dir1); do
    srcf+=("$dir1/$file")
done
#Adds filepaths from the converted directory to cnvf array
for file in $(ls -1 $dir2); do
    cnvf+=("$dir2/$file")
done

#Checks if source and convert folders have the same number of files
if [ ${#srcf[*]} -eq ${#cnvf[*]} ]
then
    #Counter variable
    fnum=0
    #Loops through the arrays and runs touch command on pairs of files to transfer the metadata
    while [ $fnum -lt ${#srcf[*]} ]; do
        echo $fnum
        echo ${srcf[$fnum]} ${cnvf[$fnum]}
        touch -r ${srcf[$fnum]} ${cnvf[$fnum]}
        ((fnum++))
    done
else
    echo "The provided paths do not have the same number of files. Both paths must have the same number of files in the same order."
fi

Pour exécuter do: sudo bash script.sh /sourcedir /converteddir


1

Si vous voulez dire le temps de modification au niveau du fichier, j'ai eu le même problème et j'ai pu le récupérer avec exiftool .

exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4

Cela prend les métadonnées et à FileModifyDatepartir input.mp4et la copie output.mp4.

Pour automatiser cela car j'avais un grand nombre de fichiers à transcoder, j'ai créé un outil appelé Shrinkwrap qui transcode d'abord avec FFmpeg (je me suis éloigné de HandBrake car il fallait conserver plus de métadonnées), puis récupère l'horodatage de modification avec exiftool.


0

Après beaucoup de recherches, j'ai surtout abandonné l'utilisation de vieux fichiers vidéo avec une date correcte créée / modifiée pour écraser la date créée / modifiée de mes nouveaux fichiers vidéo compressés par Handbrake. Étant donné que la plupart de mes vidéos ont la date / l'heure dans le nom de fichier, j'ai expérimenté et obtenu deux méthodes pour travailler. La première et la meilleure consiste à utiliser la méthode d'horodatage Advanced Renamer, qui PEUT changer la date de fichier modifiée, créée et accessible, pas seulement le nom du fichier lui-même. https://www.advancedrenamer.com/download .

J'ai également trouvé un script PowerShell https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/ qui pourrait être adapté par un programmeur pour d'autres formats de nom de fichier / date. Dans son état actuel, cela ne fonctionne que si le nom de fichier est structuré exactement comme dans cet exemple.

Heureusement, mon nombre de vidéos sans la date de modification dans le nom de fichier est suffisamment faible. Je peux les modifier manuellement, cela ne prendra pas trop de temps.

J'ai essayé d'utiliser ffmpeg, mais sa commande map_metadata ne modifie que les données à l'intérieur du fichier, pas la date de modification, créée du fichier lui-même. Ce genre de métadonnées internes Handbrake fait déjà très bien avec de toute façon.


0

Le programme MyFFmpeg le fait très bien. Dans ses options, il est possible de conserver la date de création / modification d'origine du fichier source .

Je cherchais cela parce que j'ai mes vidéos personnelles sur un serveur Plex et les fichiers sont organisés par date de création, ce qui est très utile si vous voulez voir des choses d'une année particulière.

Malheureusement, ce n'est pas une option gratuite, coûte actuellement 20 euros ou environ 21 US. Ils ont un essai pour 10 utilisations avant de devoir acheter une licence. Surpris certaines des interfaces graphiques ffmpeg gratuites n'ont pas ou ajoutent cette option.


0

J'essaie de maintenir la date de création pendant que je compresse mes vidéos GoPro MP4 incroyablement grandes en H.264.

J'ai trouvé le programme HandBrakeBatch . C'est exactement ce dont j'ai besoin pour compresser plus de 1000 fichiers en une seule fois, tout en conservant la date de création (métadonnées).

Je n'ai trouvé aucun autre programme capable de le faire. Essayé avec FFmpeg, HandBrake et Wonderful Video Converter, mais non.


Notez que HandBrakeBatch n'est plus maintenu : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.