3

我使用HM-12.0参考代码创建了一个基本的 bin 流。所以输出是一个 HEVC 编码的 bin 流(比如 input.bin)。

我有一个任务涉及读取这个基本流的标题。那就是我需要从文件中获取诸如流宽度、高度等信息input.bin

在看到很多流之后,我可以得出结论,所有这些 bin 流都是从序列开始的:

00 00 00 01

所以每当我在任何 bin 流中看到这个序列时,我可以说这个流必须由 HEVC 解码器解码。

此外,如果我想从 input.bin 中获取宽度、高度、fps 等(如 ffmpeg 中的 ff_raw_video_read_header 函数),那么需要执行哪些步骤来获取此信息?

我已经浏览了 HEVC 草案的解析部分,但对于我在视频领域的水平来说,它非常复杂。谁能建议一种从编码的 bin 文件中获取所需信息的简单方法?

任何建议都会对我很有帮助。提前致谢。

4

1 回答 1

7

我看到你最近问了很多关于视频的问题。说到视频;没有所谓的“简单方法”。

这是 AVC 的答案。获取 H264Video 流的尺寸

首先,fps 通常不在 ES 中编码。那是容器级别的东西。在 AVC/HEVC 中有一个地方,但你不应该指望它被填写。

您已经找到了起始代码。作为记录,起始代码是 2 个或多个 00,但后面是 01(它并不总是 00 00 00 01,它可以是 00 00 01、00 00 00 00 01 等)如果这个序列曾经出现在 NALU 中自然,它必须逃脱。所以,在 NALU 有效载荷中编码 00 00 01 时,将更改为 00 00 03 01。我提到这一点,因为如果你在解析时遇到这个序列,你必须忽略emulation prevention字节 (03) 的存在。删除了字节的 ESemulation prevention称为原始字节序列有效负载 (rbsp)。

起始码后的前两个字节有 nal_unit_header。类型存储位 1-6 ( ( NALU[0] >> 1 ) & 0x3F )。分辨率存储在 SPS_NUT 中,即 33。一旦有了 SPS,就可以对其进行解析。

这给我们带来了指数哥伦布编码。基本上一个exponential golomb encoded整数(缩写ue为无符号或se有符号)是一个可变长度整数。要解码,请计算前导零。此计数将告诉您整数的长度(以位为单位)。接下来,您读取那么多位并减去 1 以获得您的整数。带符号的变体是相同的,除了最后一位是符号位,例如:

1     = 0 =  0
010   = 1 =  1
011   = 2 = -1
00100 = 3 =  2
00101 = 4 = -2

接下来使用 Rec 的 7.3.2.2 中的表解析 sps。ITU-T H.265 (04/2013)(第 33 页)

并且您可以从 pic_width_in_luma_samples pic_height_in_luma_samples 和 conformance_window 参数中计算出滞留量。

于 2013-12-17T18:02:02.427 回答