gpt4 book ai didi

android - MediaExtractor 如何确定要放入 H264 NAL 单元的内容?

转载 作者:行者123 更新时间:2023-11-29 00:13:11 25 4
gpt4 key购买 nike

我在两台 Android 设备上检查了 MediaExtractor 的输出,它似乎在它们上产生了略有不同的样本,假设相同视频文件。

对于一个设备,非 VCL NAL 单元连接到下一个 VCL 单元以制作 sample 。在另一台设备上,每个非 VCL 单元构成一个完整的样本。

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

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

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

最佳答案

官方方法是提供起始代码前缀(这是在一个数据包中包含多个 NAL 单元所必需的)——这是所有 OpenMAX IL(MediaCodec 内部使用的标准)解码器所期望的(即使有些也可能支持其他格式)。无论您是在单独的缓冲区中使用 SPS/PPS(设置了 BUFFER_FLAG_CODEC_CONFIG 标志)还是在带有 VCL NAL 单元的缓冲区前添加都无关紧要 - 我认为解码器应该能够处理这两种情况。我不认为你会找到任何单独的文档来为 Android 澄清这一点,除了从设备的实际操作中隐含地推断它。

您能说出哪些设备(以及哪些平台版本)输出这些比特流变体的哪些组合,以及哪些组合在哪些设备上失败?据我所知,带有启动码的流应该在任何地方都有效,但当然也有异常(exception)。从 Android 4.3 开始,这些东西应该比在 4.1 和 4.2 上表现得更好。

一些供应商似乎确实在 MediaExtractor 中做了非标准的事情 - 我已经在 https://code.google.com/p/android/issues/detail?id=74356 上写了一个关于这个的错误报告.在这种情况下,三星特定的非标准行为通过 MediaFormat 中的 isDMCMMExtractor=1 键发出信号。我真的同意 MediaExtractor 应该更严格地指定,因为现在它主要只可用于将数据馈送到 MediaCodec (假设它被理解,至少对于供应商特定的 HW 编解码器),但很难说它实际上做了什么,如果应用想要对 MediaExtractor 输出执行其他操作(例如,使用第三方 bundle 解码器解码,或通过网络发送提取的数据等)。

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

关于android - MediaExtractor 如何确定要放入 H264 NAL 单元的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28773016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com