0

I have the values 88 40 B0 00. They are is hex. I don't understand how, but they represent a number of nanoseconds. I need help with understand this document which outlines Matroska and WebM metadata encoding. I am relatively new to this, but I am using JavaScript to alter a file duration. What I am currently using works, but the goal is to know how to set a custom duration of the WebM video file. The document shows the following for the duration parameters:

  • Element Name
    • Duration
  • The level within an EBML tree
    • 2
  • Element ID displayed as octets
    • 0x4489
  • Mandatory
    • False
  • May occur multiple times
    • False
  • Contained in
    • 1
    • 2
    • 3
    • 4
  • Available to use in WebM
    • True
  • Description
    • Duration of the Segment in nanoseconds based on TimestampScale

I am using the default time stamp scale (1000000). My question is how to I get those hex values, and turn them into hours:minutes:seconds:milliseconds. I simply am stumped :( 0x8840B000 doesn't help me.

quicVO
  • 778
  • 4
  • 13
  • Is it not 64 bits (8 hex values) instead of the 32 bits (4 hex values)...? I'm not well versed in MKV / WebM container but I've come across such info in the past, so just double-check that. – VC.One Jan 22 '21 at 08:44
  • 1
    quicVO posted the same question on Video Production Stack Exchange: [What the Hex is Going on with Milliseconds?](https://video.stackexchange.com/questions/33138) – Bavi_H Jan 22 '21 at 18:18
  • @Bavi_H, I did because I wanted to make sure that this question would get to the correct people. I was not sure which community was best, so I posted on both. – quicVO Jan 22 '21 at 20:33

1 Answers1

2

Refer to the Stack Overflow question about a TimestampScale Element.

In this question, you are asking about a Duration Element.

The Duration Element you mentioned is made of

  • Element ID 44 89
  • Element Data Size 88 (a 1-byte Variable-Size Integer indicating 8 bytes of Element Data follow)
  • Element Data 40 B0 00 00 00 00 00 00 (a big-endian 64-bit float representation of decimal 4096)

In JavaScript, you can convert those 8 bytes to the corresponding float value they represent using code like the following (adapted from an answer to question Convert uint8array to double in javascript)

let b = new Uint8Array([0x40, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
let f = (new DataView(b.buffer)).getFloat64();

When the TimestampScale value is the default (one million nanoseconds), then the Duration value is in milliseconds. In this case, the duration is 4096 milliseconds or 4.096 seconds.

If you want the duration in nanoseconds, multiply the Duration value by the TimestampScale value.

Bavi_H
  • 325
  • 2
  • 8
  • Thank you for the answer. How might I be able to turn a Float64 number into an array of hex values? – quicVO Jan 24 '21 at 21:32
  • Also will it always be a Float64 rather than a Float32? – quicVO Jan 24 '21 at 21:35
  • I know know that Float64 is of 8 values and Float32 is of 4 values. So 88-->Float64 variable, 84-->Float32 variable. Now that I know this, how might I be able to reverse a Float Number into a Uint8Array representing those values? I may ask a new question for this. – quicVO Jan 24 '21 at 23:39
  • I made a [new question](https://stackoverflow.com/questions/65877305/how-to-reverse-javascripts-dataview) – quicVO Jan 25 '21 at 00:06
  • I figured it out. Thank you so much for your help :) – quicVO Jan 25 '21 at 06:01