I’d like to overlay a timestamp on still images extracted from Sony HDR-AS30V camera videos, ideally including the frame number, to record exactly when the incident occurred. Movie players use relative time, with 00:00:00 at the beginning of the file, so we’ll need either the file timestamp or the timestamp recorded in the image’s Exif data, plus the frame number modulo 60 (or, shudder, 59.94 for NTSC).
The ExFAT format used on 64 GB MicroSD cards stores the file’s creation time, its modification time (writing data), and the most recent access time (reading data). That’s similar to the Linux ext2/3/4 filesystem time and unlike plain old FAT, which omits the access time.
The various FAT formats store local time, with no regard for time zones, Daylight Saving Time, or anything else. Linux stores times as UTC and converts to local time on the fly. This has catastrophic consequences for getting any of this right.
It helps to have
alias ls='ls -h --color=auto --time-style=long-iso' in your
The HDR-AS30V has a year-month-day calendar, a 24-hour clock, a Time Zone value, and a separate DST on/off setting.
Turning DST on adds 1 hr to the Time Zone value, turning it off subtracts 1 hr. That has the side effect of changing the clock time: not what I expected. You must, therefore, set the TZ first, then DST, then the clock, which does not follow the menu’s natural order of things.
The camera sets file timestamps as it creates the files, but Linux also meddles with the values while displaying them. Some doc suggests that Linux regards FAT file timestamps as UTC and applies DST correction, which seems to match what I see. There’s a mount option (
-o tz=UTC) that seems to have no effect, as well as an undocumented time offset (
-o time_offset=60) that also has no effect.
Setting the TZ to GMT+0 (Sony uses GMT, not UTC) for simplicity, setting the clock to the correct local time, and twiddling DST shows that:
- Rebooting (remove /insert battery) doesn’t change anything
- Metadata in file = clock setting – DST setting (-1 on, +0 off)
- MP4 / THM file create / modify times = always clock +1 hour
- MP4 / THM file access times = as create / modify until next Linux access
Under those conditions, with the clock set to (locally accurate) 1908, UTC+1, and DST off, then the Exif timestamp metadata for a movie created at that time look like this:
exiftool /mnt/part/MP_ROOT/100ANV01/MAH00036.MP4 | grep -i date File Modification Date/Time : 2014:09:01 20:08:09-04:00 File Access Date/Time : 2014:09:01 19:10:14-04:00 File Inode Change Date/Time : 2014:09:01 20:08:09-04:00 Create Date : 2014:09:01 19:08:03 Modify Date : 2014:09:01 19:08:08 Track Create Date : 2014:09:01 19:08:03 Track Modify Date : 2014:09:01 19:08:08 Media Create Date : 2014:09:01 19:08:03 Media Modify Date : 2014:09:01 19:08:08
The corresponding filesystem values:
ll /mnt/part/MP_ROOT/100ANV01/ total 146M ... snippage ... -rwxr-xr-x 1 ed root 14M 2014-09-01 20:08 MAH00036.MP4 -rwxr-xr-x 1 ed root 8.5K 2014-09-01 20:08 MAH00036.THM ll -c /mnt/part/MP_ROOT/100ANV01/ total 146M ... snippage ... -rwxr-xr-x 1 ed root 14M 2014-09-01 20:08 MAH00036.MP4 -rwxr-xr-x 1 ed root 8.5K 2014-09-01 20:08 MAH00036.THM ll -u /mnt/part/MP_ROOT/100ANV01/ total 146M ... snippage ... -rwxr-xr-x 1 ed root 14M 2014-09-01 19:10 MAH00036.MP4 -rwxr-xr-x 1 ed root 8.5K 2014-09-01 20:08 MAH00036.THM
The THM file contains a 160×120 pixel JPG thumbnail image taken from the first frame of the corresponding MP4 file. For longer movies, it’s more obvious that the MP4 file creation date is the start of the movie and its modification date is the end. The maximum 4 GB file size of corresponds to exactly 22:43 of 1920×1080 movie @ 60 frame/sec (the metadata says 59.94).
The +1 hour offset in the file create / modify times comes from the FAT timestamp being (incorrectly) adjusted by the Linux DST setting. When exiftool reads the MP4 file, that resets its access time to the actual time as seen by Linux, thereby crushing the bogus FAT time.
Doing the seemingly sensible thing of setting the camera to have the correct local time (roughly 1930), the correct time zone, and the correct DST setting produces this jumble:
exiftool /mnt/part/MP_ROOT/100ANV01/MAH00037.MP4 | grep -i date File Modification Date/Time : 2014:09:01 20:33:15-04:00 File Access Date/Time : 2014:09:01 20:33:14-04:00 File Inode Change Date/Time : 2014:09:01 20:33:15-04:00 Create Date : 2014:09:01 23:33:11 Modify Date : 2014:09:01 23:33:14 Track Create Date : 2014:09:01 23:33:11 Track Modify Date : 2014:09:01 23:33:14 Media Create Date : 2014:09:01 23:33:11 Media Modify Date : 2014:09:01 23:33:14 ll /mnt/part/MP_ROOT/100ANV01/MAH00037* -rwxr-xr-x 1 ed root 11M 2014-09-01 20:33 /mnt/part/MP_ROOT/100ANV01/MAH00037.MP4 -rwxr-xr-x 1 ed root 8.2K 2014-09-01 20:33 /mnt/part/MP_ROOT/100ANV01/MAH00037.THM ll -c /mnt/part/MP_ROOT/100ANV01/MAH00037* -rwxr-xr-x 1 ed root 11M 2014-09-01 20:33 /mnt/part/MP_ROOT/100ANV01/MAH00037.MP4 -rwxr-xr-x 1 ed root 8.2K 2014-09-01 20:33 /mnt/part/MP_ROOT/100ANV01/MAH00037.THM ll -u /mnt/part/MP_ROOT/100ANV01/MAH00037* -rwxr-xr-x 1 ed root 11M 2014-09-01 19:34 /mnt/part/MP_ROOT/100ANV01/MAH00037.MP4 -rwxr-xr-x 1 ed root 8.2K 2014-09-01 20:33 /mnt/part/MP_ROOT/100ANV01/MAH00037.THM
The only correct time in that mess is in the next-to-last line: the access time for the MP4 file. Every other timestamp comes out wrong, with the internal metadata values being off by +4 hours; that suggests the camera sets the internal timestamps to UTC.
As nearly as I can figure, the only way to make this work requires setting the clock to the local time, TZ to UTC+0, and DST off. That will screw up the filesystem timestamps, but at least the Exif metadata will be correct, for some value of correct.
The camera’s GPS receiver depends on the clock for its initial synchronization. I don’t know how the TZ and DST settings affect the clock’s correctness for that purpose.
I do not know if / how / when the displayed times have been altered by the programs that display them.
I think exiftool can extract the times from the internal metadata and fix up the filesystem times, but that’ll take more tinkering.
Sheesh & similar remarks…