2013-12-17 60 views
2

我已经使用HM-12.0参考代码创建了基本bin流。所以输出是HEVC编码的bin流(比如input.bin)。HEVC:从输入bin流中获取输入宽度和高度

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

看到大量流之后,我可以断定,所有这些斌流从序列开始:

00 00 00 01 

所以每当我看到任何斌流这个顺序,我可以说,这个流必须由HEVC解码器解码。

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

我已经经历了HEVC草案的解析部分,但它对于我在视频领域的水平来说非常复杂。任何人都可以提出一个简单的方法来从编码的bin文件中获取所需的信息?

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

+2

FYI 00000001是H.264标准附录B中定义的起始码。只看开始代码并不能告诉你你正在处理什么类型的流,即H.264或H.265。 – Ralf

+0

尊敬的@Zax,您如何分析比特流文件?你有任何可用的代码? – zinon

回答

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中自然,它必须逃脱。所以,当编码一个00 00 01和一个NALU有效载荷时,它将被改为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来得到你的整数。签署的变体是一样的,excep最后一位是例如符号位:

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

下一页使用表解析SPS在拍摄的7.3.2.2。 ITU-T H.265(04/2013)(第33页)

而且,您可以很好地计算pic_width_in_luma_samples pic_height_in_luma_samples和conformance_window参数中的滞留。

+0

它是一个非常好的解释。除HEVC标准草案之外,您还可以从哪里阅读这些内容?请提供一些网站或一些材料的链接。对我和对本网站的任何人都有帮助。 – Zax

+1

多年的视频体验。它很难找到所有这些信息。书籍,互联网,国际电联文档和逆向工程是我学习东西的地方。 – szatmary

+0

开始的最佳地点确实是参考编解码器。在调试器中加载调试变体并开始执行代码... –