MediaExtractor如何确定在H264 NAL单元中放置什么?

时间:2015-02-27 19:41:13

标签: android h.264 mediacodec mediaextractor

我已经在两台Android设备上检查了MediaExtractor的输出,看起来它们会产生略微不同的样本,给出相同的 视频文件。

使用一个设备,非VCL NAL单元连接到下一个VCL单元 产生一个样本。在另一台设备上,每个非VCL单元构成一个完整的样本。

另一个区别:在一个器件上,样本在样本中具有前导0字节和起始码前缀(001);另一方面,这些字节被省略。

如果我尝试在另一台设备上使用第一台设备的NAL设备格式,则该视频无法播放。

如果我正在制作我自己的NAL单元(不使用MediaExtractor),是否有原则上的方法来了解MediaCodec H264解码器所期望的格式?

1 个答案:

答案 0 :(得分:2)

官方方法是使用起始码前缀(这是在一个数据包中有多个NAL单元所必需的) - 这就是所有OpenMAX IL(MediaCodec内部使用的标准)解码器所期望的(即使有些也可能支持其他格式)。你是否在一个单独的缓冲区中设置了SPS / PPS(设置了BUFFER_FLAG_CODEC_CONFIG标志)或者在具有VCL NAL单元的缓冲区之前应该无关紧要 - 解码器应该能够处理这两个问题。我不认为你会发现任何单独的文件为Android澄清这一点,除了从实际做什么隐含地推断它。

您能说出哪些设备(以及哪些平台版本)输出这些比特流变体的哪种组合以及哪种组合在哪个设备上失败? AFAIK带有启动码的流应该可以在任何地方使用,但当然可能有例外。从Android 4.3开始,这些东西应该比4.1和4.2更好。

有些供应商似乎在MediaExtractor中做了非标准的事情 - 我在https://code.google.com/p/android/issues/detail?id=74356写了一篇关于此的错误报告。在这种情况下,使用MediaFormat中的isDMCMMExtractor=1密钥来指示Samsung特定的非标准行为。我真的同意MediaExtractor应该更严格地指定,因为现在它主要只用于将数据输入MediaCodec(假设它被理解,至少对于供应商特定的硬件编解码器而言),但是很难说它实际上是什么,如果应用程序想要使用MediaExtractor输出执行其他操作(例如,使用第三方捆绑解码器进行解码,或通过网络发送提取的数据等)。

如果某些设备无法解码事实上的标准比特流格式(但只有在平台的MediaExtractor的方式被破坏时才成功),通过测试原始硬编码的解码,听起来像另一个CTS兼容性测试是合理的数据包(以便MediaExtractor无法进入并转换内容)。像EncodeDecodeTest(参见http://bigflake.com/mediacodec/)这样的CTS测试是否可以在此设备上正常工作?如果是这样,但如果解码标准数据包格式失败,则意味着设备的编码器也会输出非标准的内容。