3

Мой вопрос в двух словах

Как / где камера GoPro хранит метки HiLight?

Где я искал теги HiLight

Я уже пытался найти созданные теги в следующих местах - безрезультатно:

  • Я взглянул на теги MP4 и главы видеофайла с тегами HiLight.
  • Я установил SD-карту в устройство для чтения SD-карт, чтобы видеть все файлы на карте (т.е. не только те, которые видны через MTP при подключении самой камеры). Кажется, ни один из файлов не содержит тегов.

На компьютере с Windows я вижу теги в GoPro Studio. Мой GoPro HERO4 Silver также показывает метки на дисплее в режиме воспроизведения. В приложении GoPro я также вижу теги.

Зачем мне это нужно?

Мне любопытно! Хорошо, это еще не все;) Я также работаю на машине с Linux, где GoPro Studio недоступна. Я все еще хотел бы иметь возможность использовать созданные теги HiLight там.

2 ответа2

3

Я нашел теги HiLight: они хранятся в самих файлах MP4.

В частности, теги хранятся в блоке с типом HMMT в блоке пользовательских данных (udta) в блоке фильма (moov) контейнера MPEG-4. См. ISO/IEC 14496-12 для получения подробной информации об этих «коробках».

Блок HMMT представляется нестандартным (специфичным для GoPro) блоком ISO/IEC 14496-12. Его данные состоят из одного или нескольких 32-разрядных целых чисел. Первое целое число содержит количество доступных тегов HiLight. Все последующие целые числа напоминают упорядоченный список тегов HiLight. Каждый тег HiLight представлен в виде миллисекунды.

1

Вот пример кода для поиска этих маркеров с библиотекой PHP Reader (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";
    }
}

Функция getReader(), к сожалению, не реализована, я взломал ее в Zend/Media/Iso14496/Box.php

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

Если вы хотите сделать это в Java, эта библиотека, вероятно, полезна (она помогла мне детально изучить файл) https://github.com/sannies/isoviewer

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .