Android MediaCodec.createEncoderByType - 有多个编码器可用,should/will 使用哪一个?

Android MediaCodec.createEncoderByType - Multiple encoders available, which one should/will be used?

我的问题与这个但不完全相同。

在我拥有的所有三星设备中,我发现有多种编码器可用于 MIME 类型 "audio/mp4a-latm":

OMX.google.aac.encoder
OMX.SEC.aac.enc (Android < 5)
OMX.SEC.naac.enc (Android >= 5)

MediaCodec.createEncoderByType 会 return 优化的,我想。但是在我拥有的所有三星设备上,这种方法总是创建 Google 编码器。问题是当我比较创建两个编码器所花费的时间时,创建 google 编码器比创建三星编码器慢得多。

那么为什么 MediaCodec.createEncoderByType return 较慢的编码器?如果 google 编码器慢得多,我还应该使用它吗? (大约需要几百毫秒)。或者我应该迭代所有可用的编码器并选择三星的编码器吗?

谢谢!

在实践中,方法MediaCodec.createEncoderByType(和MediaCodec.createDecoderByType)仅returns第一个匹配的编解码器,按照它们列出的顺序。供应商可以确保对列表进行排序(实际上是在设备上的 /etc/media_codecs.xml 中)以首先列出首选的列表,或者覆盖方法的实现以使用与仅选择第一个匹配项不同的逻辑。

在这种情况下,三星似乎没有考虑过这一点,或者他们自己的硬件AAC编码器不如google SW编码器功能强大,例如支持较少profiles/options。

我猜他们已经确保至少首先列出视频的 HW 编解码器,因为那里的速度差异要大得多。

如果你比较在意速度,确实可以试试三星的。或者相反,您可以非常确定任何以 OMX.google. 开头的编解码器都是 SW 编解码器,而不是明确地寻找三星的编解码器。所以首先你可以寻找第一个不以OMX.google.开头的匹配项。如果没有找到这样的编码器,您可以迭代另一轮,选择第一个匹配的编码器(或使用 MediaCodec.createEncoderByType)。