¿Cómo hacer que Handbrake conserve el tiempo de captura / tiempo de creación?

14

Handbrake es una increíble herramienta de compresión de video, pero no parece preservar el tiempo de captura original después de comprimir un video. ¿Algúna idea de cómo arreglar esto?

pixelfreak
fuente
@slhck Sí, me refiero al tiempo de creación. Uso Lightroom para administrar mis videos y después de la compresión, el tiempo de captura / creación se convierte en tiempo modificado.
pixelfreak

Respuestas:

21

Puede copiar los metadatos existentes de un archivo a otro sin necesidad de volver a codificar el video con FFmpeg . Básicamente toma un segundo. Para hacer esto, supongamos tres archivos:

  • in.mp4 - el archivo original antes de la conversión
  • out.mp4 - el archivo después de la conversión de freno de mano
  • fixed.mp4 - el archivo con metadatos "corregidos"

El comando FFmpeg para copiar el registro completo de metadatos al nuevo archivo sería:

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

Explicación de la sintaxis:

Para descomponerlo, esto hace lo siguiente:

  • Tome dos archivos de entrada ( in.mp4y out.mp4), a los que se les asignan los ID 0 y 1, respectivamente.
  • Asigne solo las secuencias de video / audio / subtítulos del archivo 1 a la salida ( -map 1), por lo que tomamos las secuencias de bits que ya están convertidas
  • Asigne solo los metadatos del archivo 0 a la salida ( -map_metadata 0)
  • Use el códec de copia ( -c copy) para copiar todos los flujos de bits en lugar de volver a codificar el video.

Después de eso, se puede cambiar el nombre, obviamente, fixed.mp4a out.mp4.


Prueba:

Como ejemplo, aquí hay parte del registro de metadatos de mi archivo original:

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

Aquí está el archivo después de la conversión de freno de mano:

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

Aquí está el archivo final después de mapear los metadatos:

$ 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 quieres hacer todo con FFmpeg:

En realidad, no necesitas usar Handbrake si puedes usar FFmpeg, en el que se basa Handbrake de todos modos. En el caso más simple, puede hacer su conversión de esta manera:

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

Esto convertirá la entrada con el codificador x264 y el audio AAC a un archivo de salida, copiando los metadatos originales. Para cambiar la calidad de la salida, puede:

  • Cambiar el valor de CRF para video. Menor significa mejor calidad. 23 es el valor predeterminado, y cualquier cosa por debajo de 18 probablemente será visualmente sin pérdidas.
  • Cambiar la tasa de bits para audio. Consulte la guía de codificación AAC para obtener más información.

Lea la guía de codificación x264 en el wiki de FFmpeg para obtener más información.

slhck
fuente
1
Wow, esa es una solución genial, parece un poco desalentador, desearía que Handbrake haga esto detrás de escena. ¡Gracias!
pixelfreak
El comando de transferencia de metadatos funciona, pero el último comando para hacer la conversión también me dio un Unknown encoder 'libfaac'error
pixelfreak
Entonces su ffmpeg no está compilado con soporte FAAC. Intenta en su -c:a aac -strict experimentallugar.
slhck
5

Desafortunadamente, parece que el freno de mano no puede hacerlo solo, pero de manera similar al ejemplo de ffmpeg, las marcas de tiempo se pueden copiar del original después de la compresión mediante el touchcomando unix:

touch -r MVI_1234.MOV compressed_MVI_1234.m4v

esto establecerá la marca de tiempo en el archivo comprimido al mismo que el archivo de referencia dado.

André Fernandes
fuente
1
Establecerá la marca de tiempo para el archivo, sí, pero solo en el sistema de archivos. Los datos EXIF ​​no tendrán la marca de tiempo correcta "Fecha / Hora original".
Stephen Schrauger
3

Encontré una manera más fácil de hacer esto, usando un software diferente llamado Adapter: http://www.macroplant.com/adapter/

No tiene todas las configuraciones avanzadas como HandBrake, pero hace el trabajo (también usando ffmpeg) y conserva los metadatos que necesito.

pixelfreak
fuente
1
No creo que Adapter pueda hacer esto. Acabo de probar la versión más reciente y no puedo encontrar la configuración para retener metadatos en ningún lado. Además, no parece convertir todos los tipos de archivos de video, como MTS, etc.
jjj
Lástima que no sea compatible con el formato m2ts de Sony
Diego Vieira
2

Estoy usando macOS Yosemite y HandBrakeBatch : úselo para convertir archivos, pero haga clic en el cuadro "mantener fechas de creación y modificación de archivos" en el menú "Preferencias".

Luego, importo los videos a Lightroom 5, pero todavía no mantienen las fechas de creación. Pero, lo más importante, los archivos se muestran en Finder con la fecha de creación correcta. Así que los seleccioné todos en la biblioteca de Lightroom → Metadatos (columna de diálogo derecha) → Tiempo de captura → Cambiar a la fecha de creación del archivo → Cambiar todo.

Tenía 850 viejos videos familiares, tuve que hacer este proceso en lotes de 100. El freno de mano se bloquea con muchos archivos.

Regis
fuente
Bonito hallazgo, puedo verme usando esta aplicación mucho.
calum_b
Tenga en cuenta que la aplicación ya no se mantiene : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck
1

Hice un script bash que puede transferir por lotes los metadatos, utilizando touchcomo se sugirió anteriormente. Para que funcione, debe tener sus archivos originales y convertidos en directorios separados, cada uno con el mismo número de archivos (los directorios solo deben tener los archivos de video, ya que otros archivos / directorios interferirán) y en el mismo orden. Luego simplemente copia los metadatos y ya está todo listo. El script enumera todos los pares de archivos para que pueda verificar si hay errores al final si lo desea.

Es posible que el código no sea el más correcto, ya que fue mi primer script de bash adecuado, pero ha sido bastante rápido y estable para mí, así que aquí va:

#!/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

Para correr hacer: sudo bash script.sh /sourcedir /converteddir

António Bezerra
fuente
1

Si te refieres al tiempo de modificación a nivel de archivo, tuve el mismo problema y pude recuperarlo con exiftool .

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

Esto toma los metadatos y FileModifyDatede input.mp4y los copia output.mp4.

Para automatizar esto, ya que tenía una gran cantidad de archivos para transcodificar, creé una herramienta llamada Shrinkwrap que primero transcodifica con FFmpeg (me alejé de HandBrake debido a la necesidad de preservar más metadatos), luego recupera la marca de tiempo de modificación con exiftool.

bennetimo
fuente
0

Después de mucha búsqueda, me di por vencido en usar archivos de video viejos con la fecha correcta creada / modificada para sobrescribir la fecha de creación / modificación de mis nuevos archivos de video comprimidos con freno de mano. Como la mayoría de mis videos tienen la fecha / hora en el nombre del archivo, experimenté y obtuve dos métodos para trabajar. El primero y el mejor es usar el método de marca de tiempo de Advanced Renamer, que PUEDE cambiar la fecha del archivo modificado, creado y accedido, no solo el nombre del archivo en sí. https://www.advancedrenamer.com/download .

También encontré un script de PowerShell https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/ que un programador podría adaptar para otros formatos de nombre de archivo / fecha. En su estado actual, solo funciona si el nombre de archivo está estructurado exactamente como en ese ejemplo.

Afortunadamente, mi número de videos sin la fecha de modificación en el nombre del archivo es lo suficientemente bajo, puedo cambiarlos manualmente, no tomará mucho tiempo.

Intenté usar ffmpeg, pero su comando map_metadata solo cambia los datos dentro del archivo, no la fecha de modificación, creada del archivo en sí. Ese tipo de metadatos internos Handbrake ya funciona bien de todos modos.

Eregos
fuente
0

El programa MyFFmpeg hace esto muy bien. En sus opciones hay una opción para mantener la creación original / fecha modificada del archivo fuente .

Había estado buscando esto porque tengo mis videos caseros en un servidor Plex y los archivos están organizados por la fecha de creación, lo cual es muy útil si quieres ver cosas de un año en particular.

Lamentablemente, esta no es una opción gratuita, actualmente cuesta 20 euros o unos 21 dólares estadounidenses. Tienen una prueba para 10 usos antes de que tengas que comprar una licencia. Sorprendió que algunas de las GUI gratuitas de ffmpeg no tienen o agregan esta opción.

Houston
fuente
0

Intento mantener la fecha de creación mientras comprimo mis videos GoPro MP4 increíblemente grandes en H.264.

Encontré el programa HandBrakeBatch . Es exactamente lo que necesito para comprimir más de 1000 archivos de una vez, manteniendo la fecha de creación (metadatos).

No he encontrado ningún otro programa que pueda hacer esto. Intenté con FFmpeg, HandBrake y Wonderful Video Converter, pero no.

Jim
fuente
Tenga en cuenta que HandBrakeBatch ya no se mantiene : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck