Il freno a mano è un fantastico strumento di compressione video, ma non sembra preservare il tempo di acquisizione originale dopo la compressione di un video. Qualche idea su come risolvere questo problema?
Il freno a mano è un fantastico strumento di compressione video, ma non sembra preservare il tempo di acquisizione originale dopo la compressione di un video. Qualche idea su come risolvere questo problema?
Risposte:
È possibile copiare i metadati esistenti da un file a un altro senza dover ricodificare il video utilizzando FFmpeg . Praticamente ci vuole un secondo. Per fare questo, supponiamo che tre file:
in.mp4
- il file originale prima della conversioneout.mp4
- il file dopo la conversione del freno a manofixed.mp4
- il file con metadati "corretti"Il comando FFmpeg per copiare il record completo di metadati nel nuovo file sarebbe quindi:
ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
Per scomporlo, questo fa quanto segue:
in.mp4
e out.mp4
), a cui sono assegnati gli ID 0 e 1, rispettivamente.-map 1
), quindi prendiamo i bitstream già convertiti-map_metadata 0
)-c copy
) per copiare tutti i bitstream invece di ricodificare il video.Dopo di che, si potrebbe ovviamente cambiare titolo fixed.mp4
al out.mp4
.
Ad esempio, ecco parte del record di metadati del mio file originale:
$ mediainfo in.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19
Ecco il file dopo la conversione del freno a mano:
$ mediainfo out.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-12-24 11:39:35
Ecco il file finale dopo aver mappato i metadati:
$ 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
In realtà, non è necessario utilizzare il freno a mano se è possibile utilizzare FFmpeg, su cui si basa comunque il freno a mano. Nel caso più semplice puoi eseguire la conversione in questo modo:
ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a aac -map_metadata 0 out.mp4
Questo convertirà l'input con l'encoder x264 e l'audio AAC in un file di output, copiando i metadati originali. Per modificare la qualità dell'output, è possibile:
Leggi la guida alla codifica x264 sul wiki di FFmpeg per ulteriori informazioni.
Unknown encoder 'libfaac'
errore
-c:a aac -strict experimental
invece.
Sfortunatamente sembra che il freno a mano non possa farlo da solo, ma in modo simile all'esempio ffmpeg, i timestamp possono essere copiati dall'originale dopo la compressione usando il touch
comando unix:
touch -r MVI_1234.MOV compressed_MVI_1234.m4v
questo imposterà il timestamp sul file compresso sullo stesso del file di riferimento dato.
Ho trovato un modo più semplice per farlo, utilizzando un software diverso chiamato Adapter
: http://www.macroplant.com/adapter/
Non ha tutte le impostazioni avanzate come HandBrake ma fa il lavoro (anche usando ffmpeg) e conserva i metadati di cui ho bisogno.
Sto usando macOS Yosemite e HandBrakeBatch : utilizzalo per convertire i file, ma fai clic sulla casella "Mantieni date di creazione e modifica dei file" nel menu "Preferenze".
Quindi, importa i video su Lightroom 5, ma non mantengono ancora le date di creazione. Ma, soprattutto, i file sono mostrati nel Finder con la data di creazione corretta. Quindi li ho selezionati tutti nella libreria di Lightroom → Metadati (colonna di dialogo destra) → Tempo di acquisizione → Cambia alla data di creazione del file → Cambia tutto.
Avevo 850 vecchi video di famiglia - ho dovuto fare questo processo in lotti di 100. Il freno a mano si arresta in modo anomalo con molti file.
Ho creato uno script bash che può trasferire in batch i metadati, usando touch
come suggerito sopra. Perché funzioni, devi avere i tuoi file originali e convertiti in directory separate, ognuna con lo stesso numero di file (le directory devono avere solo i file video, poiché altri file / directory interferiranno) e nello stesso ordine. Quindi copia solo i metadati e il gioco è fatto. Lo script elenca tutte le coppie di file in modo da poter verificare eventuali errori alla fine, se lo si desidera.
Il codice potrebbe non essere il più pulito in quanto è stato il mio primo script bash corretto, ma è stato abbastanza veloce e stabile per me, quindi ecco qui:
#!/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
Per eseguire fare: sudo bash script.sh /sourcedir /converteddir
Se intendi il tempo di modifica a livello di file, ho avuto lo stesso problema ed è stato in grado di recuperarlo con exiftool .
exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4
Questo prende i metadati e FileModifyDate
da input.mp4
e li copia a output.mp4
.
Per automatizzare questo dato che avevo un gran numero di file da transcodificare, ho creato uno strumento chiamato Shrinkwrap che prima transcodifica con FFmpeg (mi sono allontanato da HandBrake a causa della necessità di conservare più metadati), quindi recupera il timestamp di modifica con exiftool.
Dopo molte ricerche, per lo più ho rinunciato a utilizzare i vecchi file video con la data corretta creata / modificata per sovrascrivere la data creata / modificata dei miei nuovi file video compressi con freno a mano. Poiché la maggior parte dei miei video ha la data / ora nel nome del file, ho sperimentato e ottenuto due metodi per funzionare. Il primo e il migliore è usare il metodo timestamp di Advanced Renamer, che può cambiare la data del file modificata, creata e accessibile, non solo il nome del file stesso. https://www.advancedrenamer.com/download .
Ho anche trovato uno script PowerShell https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/ che potrebbe essere adattato da un programmatore per altri formati di nome file / data. Allo stato attuale funziona solo se il nome del file è strutturato esattamente come nell'esempio.
Fortunatamente il mio numero di video senza la data modificata nel nome del file è abbastanza basso che posso cambiarli manualmente, non ci vorrà troppo tempo.
Ho provato ad usare ffmpeg, ma il suo comando map_metadata modifica solo i dati all'interno del file, non la data di modifica, creata dal file stesso. Questo tipo di metadati interni Handbrake funziona già bene comunque.
Il programma MyFFmpeg lo fa molto bene. Nelle sue opzioni c'è una scelta per mantenere la creazione originale / la data modificata dal file di origine .
Lo stavo cercando perché ho i miei home video su un server Plex e i file sono organizzati in base alla data di creazione, il che è molto utile se vuoi vedere cose di un determinato anno.
Purtroppo questa non è un'opzione gratuita, attualmente costa 20 euro o circa 21 USA. Hanno una versione di prova per 10 usi prima di acquistare una licenza. Sorpreso alcune delle GUI gratuite di ffmpeg non hanno o aggiungono questa opzione.
Cerco di mantenere la data di creazione mentre comprimo i miei incredibilmente grandi video GoPro MP4 in H.264.
Ho trovato il programma HandBrakeBatch . È esattamente ciò di cui ho bisogno per comprimere oltre 1000 file in una volta sola, mantenendo la data di creazione (metadati).
Non ho trovato altri programmi in grado di farlo. Provato con FFmpeg, HandBrake e Wonderful Video Converter, ma no.