Android MediaCodec.createEncoderByType - 可用的多个编码器,应该/将要使用哪个?

时间:2016-10-18 20:18:39

标签: android encoding samsung-mobile mediacodec

我的问题类似于Mime type video/avc supported by multiple encoders on my Android device,但不完全相同。

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

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

MediaCodec.createEncoderByType会返回优化的,我想。但在我拥有的所有三星设备上,此方法始终会创建Google编码器。问题是,当我比较创建两个编码器所花费的时间时,创建一个谷歌编码器比创建三星编码器慢得多。

那么为什么MediaCodec.createEncoderByType会返回较慢的编码器?如果速度慢得多,我还应该使用谷歌编码器吗? (需要几百毫秒)。或者我应该迭代所有可用的编码器并选择三星编码器吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

在这种情况下,似乎三星没有想到这一点,或者他们自己的硬件AAC编码器比google SW编码器功能更少,比如支持更少的配置文件/选项。

我猜他们已经确定至少列出了视频的硬件编解码器,因为速度差异更大。

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