解析hevc比特流

时间:2014-07-18 14:05:18

标签: hevc bitstream h.265

有没有办法解析HEVC比特流文件?

我希望能够创建一个新的比特流文件,其中包含从原始比特流文件中选择的所选nal单元数据包。

编辑:我插入了我的代码。请找到我的比特流文件here

#library for searching in a string
import re

#library to keep dictionary order
import collections
import bitstring
from bitstring import BitStream, BitArray, ConstBitStream, pack
from bitstring import ByteStore, offsetcopy

#read bitstream file
s = BitStream(filename='11LTCCA_560x416_50Hz_8b_P420_GOP8_IP48_200frms_QP28.HEVC.str')

#find no of packets
pcks = list(s.findall('0x000001', bytealigned=True))

print len(pcks)

#set the current position, in the beginning of the nal unit.
s.pos =pcks[0]-8
print s.pos

#find the number of bits of first nal packet
no_p = pcks[1]-pcks[0]


forbidden_zero_bit = s.read(1)
nal_unit_type = s.read('uint:6')

# go to the beginning of the second nal unit
s.read(no_p)
# print nal unit type of the 1st packet
print nal_unit_type

no_p = pcks[2]-pcks[1]
s.pos = pcks[1]-8
print s.pos
forbidden_zero_bit = s.read(1)
nal_unit_type = s.read('uint:6')
s.read(no_p)
print nal_unit_type

2 个答案:

答案 0 :(得分:8)

如果您只想拍摄一些nal单位数据包(例如,取决于图层ID和时间ID),并且您不需要修改VPS,SPS,PPS,Slice Header等,那么您也可以很容易自己实现:

相应的语法在HEVC standard的附件B“字节流格式”中说明。

简而言之:

  1. 在比特流文件中搜索模式0x000001,它将所有nal单元分开。此外,如果下一个nal单元是访问单元的第一个nal单元(访问单元=用于解码整个帧的所有nal单元),则此模式之前可以有一个0x00字节。

  2. 根据HEVC standard的7.3.1.2节读取最终单位标题,并根据您想要的标准保留/删除最终单位。确保保留参数集(根据HEVC standard的表7-1,nal单位类型32,33和34)。

  3. 将所有nal单位汇总到一个新文件中,并确保中间始终有0x000001序列。

  4. 我曾经使用Python做过类似的事情,效果非常好。如果您想更轻松地阅读最终单元标题,请使用bitstring module。如果你想这样做并有更详细的问题,你可以向我寻求帮助。

    修改 关于您发布的代码: 为什么在BitStream对象(s.pos =pcks[0]-8s.pos = pcks[1]-8)中分配位置时会放置“-8”?这应该是+24(24位= 3字节=最小单位分隔符0x000001的长度),在分隔符后开始读取以获得nal单位。但是,您在阅读数据时必须考虑到这一点:no_p = pcks[1]-pcks[0]应为no_p = pcks[1]-pcks[0]-24,因为您在最终单位分隔符后开始阅读。

    如果你感到困惑,第一个找到的位置(pcks[0])是8,而不是0:在每个nal单位分隔符之前,根据{的附录B,可以有任意数量的零字节。 {3}}。通常,每个访问单元之前总是有一个零字节。

答案 1 :(得分:0)

您可以尝试GStreamer。他们有一个解析H.265 / HEVC的插件。只是说插件还是新的,所以我不确定它现在有多稳定。

您可以获得更多详情here