官方方法是存在起始码前缀(这是在一个数据包中包含多个 NAL 单元所必需的) - 这是所有 OpenMAX IL(在 MediaCodec 内部使用的标准)解码器所期望的(即使有些也可能支持其他格式)。无论您是在单独的缓冲区中(BUFFER_FLAG_CODEC_CONFIG
设置了标志)还是在带有 VCL NAL 单元的缓冲区中添加 SPS/PPS 都无关紧要 - 我认为解码器应该能够处理这两者。我认为您不会找到任何单独的文档来为 Android 澄清这一点,除了从设备实际执行的操作中隐含地推断出来。
你能说出哪些设备(以及哪些平台版本)输出这些比特流变体的哪个组合,以及哪个组合在哪个设备上失败?AFAIK 带有起始码的流应该在任何地方都可以工作,但当然可能会有例外。从 Android 4.3 开始,这些东西应该比它们在 4.1 和 4.2 上的表现要好得多。
一些供应商似乎确实在 MediaExtractor 中做了非标准的事情 - 我已经在https://code.google.com/p/android/issues/detail?id=74356上写了一份关于此的错误报告。在这种情况下,三星特定的非标准行为会isDMCMMExtractor=1
通过 MediaFormat 中的密钥发出信号。我真的同意 MediaExtractor 应该更严格地指定,因为现在它主要只能用于将数据输入 MediaCodec (假设它被理解,至少对于供应商特定的硬件编解码器),但很难说它实际上做了什么,如果应用程序想要对 MediaExtractor 输出做其他事情(例如,使用第三方捆绑解码器进行解码,或通过网络发送提取的数据等)。
如果某些设备无法解码事实上的标准比特流格式(但只有当它被平台的 MediaExtractor 处理的方式破坏时才能成功),听起来像另一个 CTS 兼容性测试是有保证的,通过测试原始硬编码数据包的解码(所以MediaExtractor 不能介于两者之间并转换事物)。像 EncodeDecodeTest(请参阅http://bigflake.com/mediacodec/)这样的 CTS 测试是否在此设备上正常工作?如果是这样,但如果解码标准数据包格式失败,则意味着设备的编码器也会输出一些非标准的东西。