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?
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?
Respuestas:
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ónout.mp4
- el archivo después de la conversión de freno de manofixed.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
Para descomponerlo, esto hace lo siguiente:
in.mp4
y out.mp4
), a los que se les asignan los ID 0 y 1, respectivamente.-map 1
), por lo que tomamos las secuencias de bits que ya están convertidas-map_metadata 0
)-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.mp4
a out.mp4
.
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
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:
Lea la guía de codificación x264 en el wiki de FFmpeg para obtener más información.
Unknown encoder 'libfaac'
error
-c:a aac -strict experimental
lugar.
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 touch
comando 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.
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.
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.
Hice un script bash que puede transferir por lotes los metadatos, utilizando touch
como 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
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 FileModifyDate
de input.mp4
y 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.
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.
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.
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.