GoPro 相机如何/在哪里存储 HiLight 标签?

GoPro 相机如何/在哪里存储 HiLight 标签?

我的问题概括

GoPro 相机商店如何/在哪里HiLight 标签

我在哪里寻找 HiLight 标签

我已尝试在以下位置查找创建的标签 - 但没有成功:

  • 我查看了带有 HiLight 标签的视频文件的 MP4 标签和章节。
  • 我已将 SD 卡安装在 SD 卡读卡器中,以便能够查看卡上的所有文件(即,不仅仅是通过中期计划连接相机本身时)。没有任何文件似乎包含标签。

在 Windows 机器上,我可以在 GoPro Studio 中看到标签。我的 GoPro HERO4 Silver 也会在播放模式下在其显示屏上显示标签。在 GoPro App 中,我也可以看到标签。

我为什么需要这个?

我很好奇!好吧,这不是全部 ;) 我也使用 Linux 机器,GoPro Studio 不可用。我仍然希望能够在那里使用创建的 HiLight 标签。

答案1

我找到了 HiLight 标签:它们存储在 MP4 文件本身中。

具体来说,标签存储在MPEG-4 容器的电影框 ( )HMMT中的用户数据框 ( ) 类型的框中。请参阅udtamoovISO/IEC 14496-12了解这些“盒子”的详细信息。

HMMT框似乎是非标准(GoPro 专用)ISO/IEC 14496-12框。其数据由一个或多个 32 位整数组成。第一个整数包含可用 HiLight 标签的数量。所有后续整数类似于有序的 HiLight 标签列表。每个 HiLight 标签都表示为毫秒值。

答案2

我想用 Python 做一个高亮解析器。GoPro 专用框(在moov>中udata,正如 Chriki 指出的那样)称为GPMF。高亮的特定标签是MANLB。每个高亮都有一个MANLB[手动标签(可能)]。出于某种原因,高亮的时间(以毫秒为单位)存储了三次(绿色的(如图所示)

在十六进制编辑器中,您还可以搜索Highlights。再往前几个字节,您可以找到 -Label HLMT(不知道这是什么)。之后,手册突出显示开始。

点击此处查看 HEX 编辑器的图片

我还用 python 编写了一个解析器,它提取突出显示并将其保存到 txt 文件中: 链接至我的 GoPro Highlight Parser

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)

答案3

以下是使用 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

答案4

截至目前,至少对于 GoPro HERO 7 Black 来说,HiLight 标签以章节形式存储在 MP4 文件中。例如,您可以使用 VLC 查看它们(播放 -> 章节)

相关内容