video - HEVC:从输入二进制流中获取输入宽度和高度

标签 video ffmpeg video-processing hevc h.265

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

我有一项任务涉及读取此基本流的 header 。也就是说,我需要从 input.bin 文件中获取诸如流宽度、高度等信息。

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

00 00 00 01

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

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

HEVC draft的解析部分我已经看完了,但是对于我视频领域的水平来说还是很复杂的。谁能建议一种从编码的 bin 文件中获取所需信息的简单方法?

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

最佳答案

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

这是 AVC 的答案。 Fetching the dimensions of a H264Video stream

首先,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)。移除了emulation prevention 字节的 ES 被称为 Raw Byte Sequence Payload (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 参数计算延迟。

关于video - HEVC:从输入二进制流中获取输入宽度和高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20627538/

相关文章:

捕获视频后android视频方向发生变化

html - Youtube 的 HTML5 视频播放器如何控制缓冲?

html - 我在哪里可以找到有关 WebM 实时 http 流媒体的信息?

php - 使用 ffmpeg 将视频集变量 $process 转换为 1

python - 使用 GStreamer 和 GNonLin 的视频过渡不起作用

ruby-on-rails-3 - 请求文件头信息

python - 如何在 ffmpeg-python 中合并视频和音频文件

python - 通过子进程将python的文件之类的对象传递给ffmpeg

c++ - 使用 swscale 进行图像合成

video - 为什么 ffmpeg 中的位移复杂滤波器对 Cb 和 Cr 平面的位移与 lum 不同?