2

我在两台 Android 设备上检查了 MediaExtractor 的输出,在给定相同的视频文件的情况下,它似乎在它们上产生了稍微不同的样本。

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

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

如果我尝试将 NAL 单元的格式用于另一台设备上的第一个设备,则视频无法播放。

如果我正在制作自己的 NAL 单元(不使用 MediaExtractor),是否有一种原则方法可以知道 MediaCodec H264 解码器期望什么格式?

4

1 回答 1

2

官方方法是存在起始码前缀(这是在一个数据包中包含多个 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 测试是否在此设备上正常工作?如果是这样,但如果解码标准数据包格式失败,则意味着设备的编码器也会输出一些非标准的东西。

于 2015-03-01T13:16:22.643 回答