返回

H264Reader:TS视频数据的解码器

Android

H264Reader:ExoPlayer中的H.264视频解析器

1. H264Reader简介

什么是H264Reader?
H264Reader是ExoPlayer媒体播放库中负责解析H.264格式视频数据的组件。它通过从TsExtractor中接收PES payload并将其解析为可解码的NAL单元来实现此目的。

H264Reader的工作流程

  1. 从TsExtractor接收PES payload。
  2. 根据PES payload中的视频类型使用指定Reader继续解析。
  3. 如果payload是H.264格式,就会使用H264Reader来继续解析PES payload。
  4. H264Reader会先检查PES payload的格式,并从中提取出SPS、PPS和SEI等信息。
  5. 然后,H264Reader会将这些信息传递给下游组件,以便进行解码和渲染。

2. H264Reader源代码分析

代码示例:

public class H264Reader implements ExtractorReader {

  private static final int NAL_UNIT_TYPE_SPS = 7;
  private static final int NAL_UNIT_TYPE_PPS = 8;
  private static final int NAL_UNIT_TYPE_SEI = 6;

  private final ElementaryStreamChunkOutput output;
  private final SeiReader seiReader;
  private final NalUnitTargetBuffer sps;
  private final NalUnitTargetBuffer pps;

  private boolean hasOutputFormat;
  private int nalUnitLengthFieldLength;

  public H264Reader(ElementaryStreamChunkOutput output) {
    this.output = output;
    this.seiReader = new SeiReader(output, NAL_UNIT_TYPE_SEI);
    this.sps = new NalUnitTargetBuffer(NAL_UNIT_TYPE_SPS);
    this.pps = new NalUnitTargetBuffer(NAL_UNIT_TYPE_PPS);
  }

  // ...
}

关键方法:

  • seek(): 在读取新数据之前,重置解析状态。
  • process(): 解析输入数据,提取NAL单元并写入输出。
  • findSpsAndPpsNalUnits(): 从输入数据中搜索SPS和PPS NAL单元。
  • writeNalUnit(): 将NAL单元写入输出。
  • buildOutputFormat(): 根据SPS和PPS数据构建视频输出格式。
  • readNalUnitType(): 从输入数据中读取NAL单元类型。

3. 常见的H264Reader错误及解决方法

问题: 读取NAL单元类型时抛出InvalidNalUnitException异常。
原因: NAL单元类型不是有效的起始码。
解决方法: 确保输入数据包含有效的起始码。

问题: H264Reader无法解析PES payload。
原因: 输入数据格式不正确,或者H264Reader的配置不正确。
解决方法: 检查输入数据是否符合H.264规范,并确保H264Reader已正确配置。

4. 常见问题解答

1. H264Reader是如何解析H.264视频数据的?
它从TsExtractor中接收PES payload并将其解析为可解码的NAL单元。

2. H264Reader中哪些方法是关键的?
seek()、process()、findSpsAndPpsNalUnits()、writeNalUnit()、buildOutputFormat()和readNalUnitType()。

3. H264Reader遇到InvalidNalUnitException异常的常见原因是什么?
输入数据包含无效的起始码。

4. H264Reader如何构建视频输出格式?
它根据SPS和PPS数据构建视频输出格式。

5. H264Reader在ExoPlayer中的作用是什么?
它负责解析H.264格式的视频数据,以便进行解码和渲染。