MediaExtractor如何解析H264 NAL单元?

3
我正在尝试理解Android MediaExtractor如何解析H264(包含在容器格式中)。
如果我检查H264流,我会发现它由以00 00 00 01为分隔符的NAL单元组成。
MediaExtractor返回的样本正是这些NAL单元,每个都以该标记开头 - 但对于特定数据源,前三个NAL单元被串联在一起。前两个NAL单元非常短(29和8字节)。
为什么会发生这种串联?如果我要手动解析H264,我怎么知道要进行串联?
对于前三个NAL单元,起始码前缀后面的字节分别是103、104和101十进制。对于接下来的大多数NAL单元,它是65,并且偶尔是101。

1
你需要阅读这个链接: https://dev59.com/qGAf5IYBdhLWcg3wOQi2#24890903 - szatmary
1
看起来非VCL NAL单元被累积,然后与下一个VCL NAL单元连接在一起。 - Paul Steckler
只要我在每个NAL单元后删除尾随的0,我得到的结果与MediaExtractor相同。除了在我的数据末尾多出2或3个单元之外,这是MediaExtractor没有提供的。我没有看到流结束或序列单元类型,所以不确定发生了什么。 - Paul Steckler
序列的结尾是可选的,很少使用(如果有的话)。 - szatmary
1个回答

1

了解h264流的格式可以回答您的问题。

在任何IDR/non-IDR帧(通常称为iFrame和pFrame)之前,Android需要两个名为序列参数集(SPS)和图像参数集(PPS)的配置单元。

前两个NAL单元仅仅是为了方便而连接在一起。硬件编解码器能够确定这些帧是唯一的,并根据其值进行配置。第三个单元被包含在内,以便于编解码器完成配置后立即开始工作。

TLDR;手动解码这样的原始流不需要这种结构。相反,您只需逐个分析每个NAL单元。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接