Come fare in modo che il freno a mano preservi i tempi di acquisizione / creazione?


14

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?


@slhck Sì, intendo tempo di creazione. Uso Lightroom per gestire i miei video e dopo la compressione, il tempo di acquisizione / creazione diventa Tempo modificato.
pixelfreak,

Risposte:


21

È 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 conversione
  • out.mp4 - il file dopo la conversione del freno a mano
  • fixed.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

Spiegazione della sintassi:

Per scomporlo, questo fa quanto segue:

  • Prendi due file di input ( in.mp4e out.mp4), a cui sono assegnati gli ID 0 e 1, rispettivamente.
  • Mappa solo i flussi video / audio / sottotitoli dal file 1 all'output ( -map 1), quindi prendiamo i bitstream già convertiti
  • Mappa solo i metadati dal file 0 all'output ( -map_metadata 0)
  • Usa il codec copia ( -c copy) per copiare tutti i bitstream invece di ricodificare il video.

Dopo di che, si potrebbe ovviamente cambiare titolo fixed.mp4al out.mp4.


Prova:

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    

Se vuoi fare tutto con FFmpeg:

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:

  • Modifica il valore CRF per il video. Inferiore significa migliore qualità. 23 è l'impostazione predefinita e probabilmente qualsiasi cosa inferiore a 18 sarà visivamente senza perdita di dati.
  • Cambia il bitrate per l'audio. Consulta la guida alla codifica AAC per maggiori informazioni.

Leggi la guida alla codifica x264 sul wiki di FFmpeg per ulteriori informazioni.


1
Wow, è una bella soluzione, sembra un po 'scoraggiante, vorrei che Handbrake facesse questo dietro le quinte. Grazie!
pixelfreak,

Il comando di trasferimento dei metadati funziona, ma l'ultimo comando per fare anche la conversione mi ha dato un Unknown encoder 'libfaac'errore
pixelfreak

Quindi il tuo ffmpeg non è compilato con il supporto FAAC. Prova -c:a aac -strict experimentalinvece.
slhck

5

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 touchcomando unix:

touch -r MVI_1234.MOV compressed_MVI_1234.m4v

questo imposterà il timestamp sul file compresso sullo stesso del file di riferimento dato.


1
Imposta il timestamp per il file, sì, ma solo nel filesystem. I dati EXIF ​​non avranno il timestamp "Data / Ora originale" corretto.
Stephen Schrauger,

3

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.


1
Non credo che Adapter sia in grado di farlo. Ho appena testato la versione più recente e non riesco a trovare l'impostazione per conservare i metadati da nessuna parte. Inoltre, non sembra convertire tutti i tipi di file video, come MTS, ecc.
jjj

peccato che non sia compatibile con il formato m2ts di sony
Diego Vieira,

2

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.


Bella scoperta, posso vedermi usare questa app molto.
calum_b,

Nota che l'app non è più mantenuta : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck

1

Ho creato uno script bash che può trasferire in batch i metadati, usando touchcome 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


1

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 FileModifyDateda input.mp4e 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.


0

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.


0

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.


0

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.


Si noti che HandBrakeBatch non è più gestito : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.