How to make Handbrake preserve capture time / creation time?

34,095

Solution 1

You can copy the existing metadata from one file to another without needing to re-encode the video using FFmpeg. It basically takes one second. To do this, let's assume three files:

  • in.mp4 – the original file before conversion
  • out.mp4 – the file after Handbrake conversion
  • fixed.mp4 – the file with "corrected" metadata

The FFmpeg command to copy the complete metadata record to the new file would then be:

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

Explanation of syntax:

To break it down, this does the following:

  • Take two input files (in.mp4 and out.mp4), which are assigned the IDs 0 and 1, respectively.
  • Map only the video/audio/subtitle streams from file 1 to the output (-map 1), so we take the bitstreams that are already converted
  • Map only the metadata from file 0 to the output (-map_metadata 0)
  • Use the copy codec (-c copy) to copy all the bitstreams instead of re-encoding the video.

After that, you could obviously rename fixed.mp4 to out.mp4.


Proof:

As an example, here's part of the metadata record of my original file:

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

Here's the file after Handbrake conversion:

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

Here's the final file after mapping the metadata:

$ 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    

If you want to do all with FFmpeg:

Actually, you don't really need to use Handbrake if you can use FFmpeg, which Handbrake relies on anyway. In the simplest case you can do your conversion like this:

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

This will convert the input with the x264 encoder and AAC audio to an output file, copying the original metadata. In order to change the quality of the output, you can:

  • Change the CRF value for video. Lower means better quality. 23 is default, and anything below 18 will probably be visually lossless.
  • Change the bitrate for audio. See the AAC encoding guide for more info.

Read the x264 encoding guide on the FFmpeg wiki for more.

Solution 2

Unfortunately it seems handbrake can't do it on its own, but similarly to the ffmpeg example, the timestamps can be copied from the original after compression by using the touch unix command:

touch -r MVI_1234.MOV compressed_MVI_1234.m4v

this will set the timestamp on the compressed file to the same as the given reference file.

Solution 3

I found an easier way to do this, using a different software called Adapter: http://www.macroplant.com/adapter/

It doesn't have all the advanced settings like HandBrake but it does the job (also using ffmpeg) and retains the metadata I need.

Solution 4

I made a bash script that can batch transfer the metadata, using touch as suggested above. For it to work you must have your original and converted files on separate directories, each with the same number of files (the directories must only have the video files, as other files/directories will interfere) and in the same order. Then it just copies the metadata and you're all set and done. The script lists all the file pairs so you can check for errors in the end if you want.

The code might not be the neatest as it was my first proper bash script, but it's been pretty fast and stable for me, so here goes:

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

To run do: sudo bash script.sh /sourcedir /converteddir

Solution 5

I am using macOS Yosemite and HandBrakeBatch – use it to convert files, but click at the "keep file creation and modification dates" box in the "Preferences" menu.

Then, I import the videos to Lightroom 5, but they still don't keep the creation dates. But, most importantly, the files are shown in Finder with the correct Creation date. So I selected all of them in the Lightroom library → Metadata (right dialog column) → Capture Time → Change to File's creation date → Change All.

I had 850 old family videos – I had to do this process in batches of 100. Handbrake crashes with a lot of files.

Share:
34,095
Liza
Author by

Liza

Updated on September 18, 2022

Comments

  • Liza
    Liza almost 2 years

    Handbrake is an awesome video compression tool, but it doesn't seem to preserve the original capture time after a video is compressed. Any idea how to fix this?

    • Liza
      Liza over 11 years
      @slhck Yes I mean Creation Time. I use Lightroom to manage my videos and after compression, the Capture/Creation time becomes Modified Time.
  • Liza
    Liza over 11 years
    Wow, that's a cool workaround, looks a bit daunting though, I wish Handbrake does this behind-the-scene. Thanks!
  • jjj
    jjj almost 10 years
    I don't think Adapter is able to do this. I've just tested the newest version and can't find the setting for retaining metadata anywhere. Additionally, it doesn't seem to convert all video file types, such as MTS, etc.
  • Liza
    Liza over 9 years
    The metadata transfer command works, but the last command to do the conversion as well gave me an Unknown encoder 'libfaac' error
  • slhck
    slhck about 9 years
    Then your ffmpeg is not compiled with FAAC support. Try -c:a aac -strict experimental instead.
  • Diego Vieira
    Diego Vieira over 8 years
    too bad it's not compatible with sony's m2ts format
  • calum_b
    calum_b over 7 years
    Nice find, can see myself using this app a lot.
  • slhck
    slhck over 5 years
    Note that HandBrakeBatch is no longer maintained: osomac.com/2013/08/08/handbrake-adds-real-batch-processing
  • slhck
    slhck over 5 years
    Note that the app is no longer maintained: osomac.com/2013/08/08/handbrake-adds-real-batch-processing
  • julian-alarcon
    julian-alarcon about 3 years
    it seems that an additional flag -movflags use_metadata_tags is sometimes needed video.stackexchange.com/questions/23741/…
  • julian-alarcon
    julian-alarcon about 3 years
    A full command line adding the option to copy special tags will be ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy -movflags use_metadata_tags fixed.mp4
  • Admin
    Admin about 2 years
    What's the best way to batch compress a whole bunch of videos in a folder while preserving creation date etc. metadata WITHOUT having to type in and out file names for each file? (On Win10)
  • Admin
    Admin about 2 years
    @InfiniteLoop I am no Windows expert. If you reference this question and ask for a specific solution for Windows – ideally showing what you've already tried – that'd give you a better chance at an answer.