В каком блоке находится временная метка MP4 "chpl" Box? - PullRequest
0 голосов
/ 24 февраля 2020

Примечание: Пока я спрашиваю о поле "chpl", я предполагаю, что тот же вопрос можно задать о окнах "krok" и "dlay" с одинаковым ответом.

Я пытаюсь получить информацию о главе из файла MP4. Я использую библиотеку mp4parser для чтения блоков, но, к сожалению, она не знает о главах, поэтому я сам анализирую эти данные, используя spe c.

Поскольку spe c утверждает, что каждая глава содержит метку времени UI64, размер заголовка UI8 и заголовок UI8 [titleSize], это мой код для чтения глав:

ByteBuffer buffer = // 

int chapterCount = buffer.get();
List<Chapter> chapters = new ArrayList<>(chapterCount);

for (int i = 0; i < chapterCount; i++) {
    final long timestamp = buffer.getLong();
    final int titleSize = buffer.get();

    final byte[] bytes = new byte[titleSize];
    buffer.get(bytes);
    final String title = new String(bytes, StandardCharsets.UTF_8);

    chapters.add(new Chapter(title).startTime(timestamp));
}

Это работает ; все заголовки глав анализируются правильно, поэтому я предполагаю, что метки времени тоже правильные.

Однако теперь у меня есть метки времени, которые я не могу сопоставить с временем, например:

0           -> 0:00
70070000    -> ~0:21
13605925667 -> ~22:22

Там Нет очевидной связи между значениями и временем, которому они соответствуют.

После попытки угадать фактор без удачи, я прочитал spe c и нашел «TimeScale» в поле «mvhd». Это 1000, поэтому метки времени в поле «chpl» должны иметь единицу измерения «мс». Очевидно, что это не так.

Как определить / вычислить, в какой единице находится отметка времени «chpl»?

...