如何在原始 HEVC/H.265 流中找到一个完整视频帧的第一个 NALunit?
How to find the first NALunit of one complete video frame in raw HEVC/H.265 stream?
在原始 HEVC/H265 基本流中,如何找到一个视频帧的第一个 NALunit?访问单元 delimiter/access_unit_delimiter_rbsp() 似乎是个不错的选择,但在视频流中是可选的。
我认为您应该阅读 hevc 规范。我从来没有做过,但我在 HM 编解码器方面的经验可以提供一些帮助。
一开始比特流中的当前pos为0,解码器提取并丢弃所有字节(leading_zero_8bits
)直到他找到0x00000001或0x000001然后他丢弃前面提到的3或4个字节(zero_byte
和 start_code_prefix_one_3bytes
),然后他读取所有 3 个字节(在循环中)直到他找到 0x000003 或流的末尾,这就是实际数据。然后如果它不是流的结尾而不是 0x00000001 或 0x00001 他将丢弃所有字节(trailing_zero_8bits
)直到他找到它们,这意味着新的 NALu 或流的结尾。然而,一个帧可以用超过 1 个 NALu 来表示。
之后,他通过在解码开始前清除 EmulationPreventionByte
并删除 cabac_zero_word
将有效载荷转换为 RBSP。
在原始 HEVC/H265 基本流中,如何找到一个视频帧的第一个 NALunit?访问单元 delimiter/access_unit_delimiter_rbsp() 似乎是个不错的选择,但在视频流中是可选的。
我认为您应该阅读 hevc 规范。我从来没有做过,但我在 HM 编解码器方面的经验可以提供一些帮助。
一开始比特流中的当前pos为0,解码器提取并丢弃所有字节(leading_zero_8bits
)直到他找到0x00000001或0x000001然后他丢弃前面提到的3或4个字节(zero_byte
和 start_code_prefix_one_3bytes
),然后他读取所有 3 个字节(在循环中)直到他找到 0x000003 或流的末尾,这就是实际数据。然后如果它不是流的结尾而不是 0x00000001 或 0x00001 他将丢弃所有字节(trailing_zero_8bits
)直到他找到它们,这意味着新的 NALu 或流的结尾。然而,一个帧可以用超过 1 个 NALu 来表示。
之后,他通过在解码开始前清除 EmulationPreventionByte
并删除 cabac_zero_word
将有效载荷转换为 RBSP。