My Question in a Nutshell

How/where does a GoPro camera store HiLight tags?

Where I have Looked for the HiLight Tags

I have already tried to find the created tags in the following locations – to no avail:

  • I have had a look at the MP4 tags and chapters of a video file with HiLight tags.
  • I have mounted the SD card in an SD card reader to be able to see all files on the card (i.e., not just the ones which are visible via MTP when connecting the camera itself). None of the files seem to contain the tags.

On a Windows machine I can see the tags in GoPro Studio. My GoPro HERO4 Silver shows the tags on its display in playback mode, too. In the GoPro App I can also see the tags.

Why do I Need this?

I’m curious! Ok, that’s not the whole story ;) I also work on a Linux machine where GoPro Studio is not available. I would still like to be able to use the created HiLight tags there.

up vote 3 down vote accepted

I’ve found the HiLight tags: they are stored in the MP4 files themselves.

In particular, the tags are stored in a box with type HMMT in the User Data Box (udta) of the Movie Box (moov) of the MPEG-4 container. See ISO/IEC 14496-12 for details on these “boxes”.

The HMMT box seems to be a non-standard (GoPro-specific) ISO/IEC 14496-12 box. Its data consists of one or more 32-bit integers. The first integer contains the number of available HiLight tags. All subsequent integers resemble an ordered list of HiLight tags. Each HiLight tag is represented as a millisecond value.

Here is some sample code to find these markers, with the PHP Reader library (https://code.google.com/p/php-reader/wiki/ISO14496).

require_once 'Zend/Media/Iso14496.php'; 
$isom = new Zend_Media_Iso14496($file);

$hmmt = $isom->moov->udta->HMMT;
if ( isset($hmmt)) {
    $reader = $hmmt->getReader();
    $reader->setOffset($hmmt->getOffset());

    $reader->readHHex(4);//skip some bytes 
    $reader->readHHex(4);//skip some bytes    

    $n = $reader->readInt32BE(); //number of points

    for ($i = 1; $i <= $n; $i++) {
        $t = $reader->readInt32BE();
        print_r($t); // marker in ms
        echo "\n";
    }
}

The getReader() is a function not implemented unfortunately, I hacked it into Zend/Media/Iso14496/Box.php

public function getReader() {
    return $this->_reader;
}

If you want to do it in java, this library is probably helpfull (it helped me looking into the file in detail) https://github.com/sannies/isoviewer

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.