Android MediaRecorder 使用哪个编码器?

Which encoder does Android MediaRecorder use?

有人知道 MediaRecorder 使用哪些 audio/video 编码器吗?

我知道我们可以选择音频/视频 mimeTypes mediaRecorder.setVideoEncoder()mediaRecorder.setAudioEncoder():

mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

但这不会告诉我正在使用哪个编码器实现,因为每个设备都可以有多个 H264 编码器(例如,一个硬件加速的编码器和一个软件加速的编码器喜欢 OMX.google.h264.encoder).

有办法知道吗?

任何人都可以 link 找到本机源代码吗?

当使用低级MediaCodec时,我们可以通过MediaCodecList访问所有编码器,获取它们的名称和能力,最后实例化正确的MediaCodec。我确信 MediaRecorder 在本机代码中做同样的事情,我只是找不到任何源代码参考。谢谢!

我期望的答案是...

MediaRecoders 本机实现是 StagefrightRecorder.cpp。 在方法 setupVideoEncoder, line #1782 中,您可以看到它正在使用 MediaCodecSource::Create,格式为 'video/avc' 作为 'mime'(第 1660 行)。

MediaCodecSource.cpp in method initEncoder in line #515 中选择了最适合的编码器。

可以找到如何选择编解码器 here

我希望这有助于浏览 android 原生媒体实现。

关于此的一些其他想法,以及与媒体的其他工作。其中使用了ExoPlayer。我们不得不处理 MediaCodec 选择并强制该播放器使用隧道编解码器。在内部实施中,他们所做的正是您提到的。

正在为下一次转发检索可能的安全编解码器的完整列表,其中 ExoPlayer 只需从列表中选择第一个。

MediaCodecListCompat mediaCodecList = Util.SDK_INT >= 21
    ? new MediaCodecListCompatV21(secure) : new MediaCodecListCompatV16();

.....

List<MediaCodecInfo> decoderInfos = getDecoderInfos(mimeType, secure);
return decoderInfos.isEmpty() ? null : decoderInfos.get(0);
    getCodecCapabilities(int index, String type);

我仍然想知道,选择一个而不是另一个编解码器没有其他优先级。我们可以假设,这是因为本地部分,供应商编解码器显然首先出现。并且(应该)对这个特定设备更好。


返回 MediaRecorder 我在 JNI native_setup JMediaCodec 的原生部分 MediaRecorder 实现之后发现了什么] 用 MediaCodec 委托本机部分。这个实现使用参考 ACodec 最有意思的地方是什么。

在这里您可以找到 MediaCodecList and external Media services, codec allocation and finally OMXCodec where all the selection and matching requests happens. So the same codec list retrived from the MediaCodecList 通过其他实现 IMediaPlayerService 的用法,其中包含有关可用编解码器名称的信息。我可以稍后检查,我们还能找到什么。


UPDATE. 所以我们发现的并不是问题的确切答案。但是您需要的所有魔法都位于几个文件中。 1) 编解码器的使用和部分选择(编解码器之间的比较器等)可以在 OMXCodec. 2) List of codecs with helpers functions located in the MediaCodecList 中找到,最后 3)IMediaPlayerService 的实现包含完整的未排序编解码器及其功能。