Android MediaRecorder使用哪种编码器?

Android MediaRecorder使用哪种编码器?,android,android-mediacodec,mediarecorder,video-encoding,android-mediarecorder,Android,Android Mediacodec,Mediarecorder,Video Encoding,Android Mediarecorder,有人知道MediaRecorder使用哪些音频/视频编码器吗 我知道我们可以使用mediaRecorder.setVideoEncoder()和mediaRecorder.setAudioEncoder()选择音频/视频模拟类型: 但这不会告诉我正在使用哪个编码器实现,因为每个设备都可以为H264使用多个编码器(例如,硬件加速编码器和软件编码器,如OMX.google.H264.encoder) 有办法知道吗 有谁能链接到本机源代码,让我们发现这一点吗 当使用低级MediaCodec时,我们可以

有人知道MediaRecorder使用哪些音频/视频编码器吗

我知道我们可以使用
mediaRecorder.setVideoEncoder()
mediaRecorder.setAudioEncoder()
选择音频/视频模拟类型:

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

有办法知道吗

有谁能链接到本机源代码,让我们发现这一点吗

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

我期待的答案是

  • MediaRecorder只使用第一个匹配的编码器,就像使用
    MediaCodec.createEncoderByType(type)
  • MediaRecorder明确首选硬件编码器
  • 别的

MediaRecorders本机实现不可用。 在方法中,您可以看到它使用的是
mediacodesource::Create
,格式为“video/avc”作为“mime”(第1660行)

在方法initEncoder中,选择最适合的编码器

可以找到编解码器的选择方式


我希望这有助于浏览androids本机媒体实现。

MediaRecorders本机实现非常有用。 在方法中,您可以看到它使用的是
mediacodesource::Create
,格式为“video/avc”作为“mime”(第1660行)

在方法initEncoder中,选择最适合的编码器

可以找到编解码器的选择方式


我希望这有助于浏览androids原生媒体的实施。

关于这方面的一些其他想法,以及其他与媒体相关的工作。使用了
ExoPlayer
。我们必须处理
MediaCodec
选择,并强制该播放器使用隧道编解码器。在内部实现中,他们正按照您提到的那样做

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

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

List decoderInfos=getDecoderInfos(mimeType,secure);
返回decoderInfos.isEmpty()?null:decoderInfos.get(0);
GetCodeCapabilities(int索引、字符串类型);
我仍然想知道,选择一个而不是另一个编解码器没有其他优先权。我们可以假设,这是因为本机部分,供应商编解码器显然是第一位的。而且(应该)更适合这个特殊的设备


返回到
MediaRecorder
我在JNI
JMediaCodec
中的
MediaRecorder
本机部分实现
native\u设置
中发现了以下内容,它使用
MediaCodec
委托本机部分。这个实现使用了最有趣的地方

在这里,您可以找到和外部媒体服务的使用情况、编解码器分配以及所有选择和匹配请求的最终发生位置。因此,从via other实现
IMediplayerService
检索到相同的编解码器列表,其中包含有关可用编解码器名称的信息。我可以稍后再查,我们还能找到什么



更新。所以我们发现的并不是问题的确切答案。但是你需要的所有魔法都只存在于少数几个文件中。1) 可以在中找到编解码器使用情况和部分选择(编解码器之间的比较器和其他)。2)
imediplayerservice
的实现中包含帮助函数的编解码器列表包含完整的未排序编解码器及其功能

关于这方面的一些其他想法,以及与媒体合作的其他想法。使用了
ExoPlayer
。我们必须处理
MediaCodec
选择,并强制该播放器使用隧道编解码器。在内部实现中,他们正按照您提到的那样做

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

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

List decoderInfos=getDecoderInfos(mimeType,secure);
返回decoderInfos.isEmpty()?null:decoderInfos.get(0);
GetCodeCapabilities(int索引、字符串类型);
我仍然想知道,选择一个而不是另一个编解码器没有其他优先权。我们可以假设,这是因为本机部分,供应商编解码器显然是第一位的。而且(应该)更适合这个特殊的设备


返回到
MediaRecorder
我在JNI
JMediaCodec
中的
MediaRecorder
本机部分实现
native\u设置
中发现了以下内容,它使用
MediaCodec
委托本机部分。这个实现使用了最有趣的地方

在这里,您可以找到和外部媒体服务的使用情况、编解码器分配以及所有选择和匹配请求的最终发生位置。因此,从via other实现
IMediplayerService
检索到相同的编解码器列表,其中包含有关可用编解码器名称的信息。我可以稍后再查,我们还能找到什么


更新。所以我们发现的并不是问题的确切答案。但是你需要的所有魔法都只存在于少数几个文件中。1) 可以在中找到编解码器使用情况和部分选择(编解码器之间的比较器和其他)。2)
imediplayerservice
的实现中包含帮助函数的编解码器列表包含完整的未排序编解码器及其功能

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