Как читать поплавок из двоичного файла WebM?

Я пытаюсь выучить двоичный файл и создать простой синтаксический анализатор WebM в PHP на основе Matroska.

Я читаю TimecodeScale, MuxingAppm WritingApp и т. Д. С unpack(format, data), Моя проблема, когда я достигаю Duration (0x4489) в Segment Information (0x1549a966) Я должен прочитать float и на основе TimecodeScale преобразовать это в секунды: 261.564s-> 00: 04: 21.564, и я не знаю как.

Это примерная последовательность:

`2A D7 B1 83 0F 42 40 4D 80 86 67 6F 6F 67 6C 65 57 41 86 67 6F 6F 67 6C 65 44 89 88 41 0F ED E0 00 00 00 00 16 54 AE 6B`

TimecodeScale := 2ad7b1 uint [ def:1000000; ]

MuxingApp := 4d80 string; ("google")

WritingApp := 5741 string; ("google")

Duration := 4489 float [ range:>0.0; ]

Tracks := 1654ae6b container [ card:*; ]{...}

Я должен прочитать число с плавающей точкой после (0x4489) и вернуть 261.564s.

1

Решение

Длительность представляет собой значение с плавающей запятой двойной точности (64 бита), представленное в IEEE 754 формат. Если вы хотите увидеть, как выполняется преобразование, проверьте этот.

TimecodeScale шкала времени в наносекундах.

В php ты можешь сделать:

$bin = hex2bin('410fede000000000');
$timecode_scale = 1e6;

// endianness
if (unpack('S', "\xff\x00")[1] === 0xff) {
$bytes = unpack('C8', $bin);
$bytes = array_reverse($bytes);
$bin = implode('', array_map('chr', $bytes));
}

$duration = unpack('d', $bin)[1];
$duration_s = $duration * $timecode_scale / 1e9;

echo "duration=${duration_s}s\n";

Результат:

duration=261.564s
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]