Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
985 views
in Technique[技术] by (71.8m points)

video - What the Hex is Going on with Milliseconds?

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.

question from:https://stackoverflow.com/questions/65833935/what-the-hex-is-going-on-with-milliseconds

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...