我使用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文件中获取所需信息的简单方法吗?
任何建议都对我很有帮助。提前谢谢。
答案 0 :(得分:5)
我见过你最近有很多关于视频的问题。说到视频;没有“简单的方法”。
这是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称为原始字节序列有效负载(rbsp)
起始代码后的前两个字节有nal_unit_header。类型存储位1-5 ( ( NALU[0] >> 1 ) & 0x3F )
。分辨率存储在SPS_NUT中,即33.一旦有了SPS,就可以解析它。
这带给我们指数golomb编码。基本上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 paramaters计算滞留量。