【问题标题】:What the Hex is Going on with Milliseconds?十六进制在毫秒内发生了什么?
【发布时间】:2021-01-21 18:49:53
【问题描述】:

我的值是 88 40 B0 00。它们是十六进制的。我不明白怎么做,但它们代表了几纳秒。我需要帮助了解this document,它概述了 Matroska 和 WebM 元数据编码。我对此比较陌生,但我正在使用 JavaScript 来更改文件持续时间。我目前正在使用的作品,但目标是知道如何设置 WebM 视频文件的自定义持续时间。该文档显示了持续时间参数的以下内容:

  • 元素名称
    • 持续时间
  • EBML 树中的级别
    • 2
  • 元素 ID 显示为八位字节
    • 0x4489
  • 强制
    • 错误
  • 可能出现多次
    • 错误
  • 包含在
    • 1
    • 2
    • 3
    • 4
  • 可在 WebM 中使用
    • 是的
  • 说明
    • 基于 TimestampScale 的分段持续时间(以纳秒为单位)

我使用的是默认时间戳刻度 (1000000)。我的问题是如何获取这些十六进制值,并将它们转换为hours:minutes:seconds:milliseconds。我简直被难住了:(0x8840B000 对我没有帮助。

【问题讨论】:

  • 不是 64 位(8 个十六进制值)而不是 32 位(4 个十六进制值)...?我不太熟悉 MKV / WebM 容器,但我过去曾遇到过此类信息,因此请仔细检查。
  • quicVO 在 Video Production Stack Exchange 上发布了同样的问题:What the Hex is Going on with Milliseconds?
  • @Bavi_H,我这样做是因为我想确保这个问题会传达给正确的人。我不确定哪个社区最好,所以我在两个社区都发布了。

标签: video hex metadata webm uint8array


【解决方案1】:

请参阅有关 TimestampScale Element 的 Stack Overflow 问题。

在这个问题中,您询问的是持续时间元素。

你提到的持续时间元素是由

  • 元素 ID 44 89
  • 元素数据大小88(一个 1 字节的可变大小整数,表示后面有 8 个字节的元素数据)
  • 元素数据 40 B0 00 00 00 00 00 00(十进制 4096 的大端 64 位浮点表示)

在 JavaScript 中,您可以使用如下代码将这 8 个字节转换为它们表示的相应浮点值(改编自 an answer 到问题 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();

如果 TimestampScale 值为默认值(一百万纳秒),则 Duration 值以毫秒为单位。在本例中,持续时间为 4096 毫秒或 4.096 秒。

如果您想要以纳秒为单位的持续时间,请将 Duration 值乘以 TimestampScale 值。

【讨论】:

  • 感谢您的回答。如何将 Float64 数字转换为十六进制值数组?
  • 它是否总是 Float64 而不是 Float32?
  • 我知道 Float64 有 8 个值,而 Float32 有 4 个值。所以 88-->Float64 变量,84-->Float32 变量。既然我知道了这一点,我如何能够将浮点数反转为表示这些值的 Uint8Array?我可能会为此提出一个新问题。
  • 我发了new question
  • 我想通了。非常感谢您的帮助:)
猜你喜欢
  • 2011-10-28
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2010-09-19
  • 2012-10-01
  • 2011-12-19
相关资源
最近更新 更多