Как / где камера GoPro хранит метки HiLight?
Мой вопрос в двух словах
Как / где камера GoPro хранит метки HiLight?
Где я искал теги HiLight
Я уже пытался найти созданные теги в следующих местах - безрезультатно:
- Я взглянул на теги MP4 и главы видеофайла с тегами HiLight.
- Я установил SD-карту в устройство чтения SD-карт, чтобы видеть все файлы на карте (то есть не только те, которые видны через MTP при подключении самой камеры). Кажется, ни один из файлов не содержит тегов.
На компьютере с Windows я вижу теги в GoPro Studio. Мой GoPro HERO4 Silver также показывает метки на дисплее в режиме воспроизведения. В приложении GoPro я также вижу теги.
Зачем мне это нужно?
Мне любопытно! Ладно, это еще не все;) Я также работаю на машине с Linux, где GoPro Studio недоступна. Я все еще хотел бы иметь возможность использовать созданные теги HiLight там.
4 ответа
Я нашел теги HiLight: они хранятся в самих файлах MP4.
В частности, теги хранятся в ящике с типом HMMT
в поле данных пользователя (udta
) коробки фильма (moov
) контейнера MPEG-4. См. ISO/IEC 14496-12 для получения подробной информации об этих "коробках".
HMMT
коробка кажется нестандартной (специфичной для GoPro) коробкой ISO/IEC 14496-12. Его данные состоят из одного или нескольких 32-разрядных целых чисел. Первое целое число содержит количество доступных тегов HiLight. Все последующие целые числа напоминают упорядоченный список тегов HiLight. Каждый тег HiLight представлен в виде миллисекунды.
Я хотел сделать парсер выделения на python. Поле для GoPro (в
moov
>
udata
как указал Чрики) называется
GPMF
. Для основных моментов используются специальные ярлыки.
MANLB
. Для каждого выделения есть один
MANLB
[этикетка вручную (вероятно)]. Почему-то время выделения в миллисекундах сохраняется трижды (на картинке зеленый)
В HEX-редакторе вы также можете искать
Highlights
. Через несколько байтов вы можете найти
HLMT
-Этикетка (не знаю, что это). После этого начинается ручная подсветка.
щелкните здесь, чтобы увидеть изображение HEX-Editor
Я также написал парсер на Python, который извлекает основные моменты и сохраняет их в текстовый файл:Ссылка на мой анализатор выделенных фрагментов GoPro.
Упрощенная версия поиска в GPMF-Box может выглядеть примерно так:
while offset < end_offset:
data = f.read(4) # read box header
if data == b"": break # EOF
if data == b'MANL':
currPos = f.tell() # remember current pointer/position
f.seek(currPos - 20) # go back to highlight timestamp
data = f.read(4) # readout highlight
timestamp = int.from_bytes(data, "big") #convert to integer
if timestamp != 0:
listOfHighlights.append(timestamp) # append to highlightlist
f.seek(currPos) # go forward again (to the saved position)
Вот пример кода для поиска этих маркеров с библиотекой 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
На данный момент, по крайней мере для GoPro HERO 7 Black, теги HiLight хранятся в виде глав в файле MP4. Вы можете увидеть их, например, с помощью VLC (Воспроизведение -> Глава)