Android MediaRecorder使用哪种编码器?

时间:2019-08-13 14:09:33

标签: android mediacodec mediarecorder video-encoding android-mediarecorder

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

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

mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

但这不会告诉我正在使用哪种编码器实现,因为每个设备可以具有用于H264的多个编码器(例如,硬件加速的编码器和软件{{1} }。

有办法知道吗?

任何人都可以链接到我们可以发现它的本地源代码吗?

使用低级OMX.google.h264.encoder时,我们可以通过MediaCodec访问所有编码器,获取其名称和功能,最后实例化正确的MediaCodecList。我敢肯定MediaCodec在本机代码中也是如此,只是找不到任何源代码参考。谢谢!

我期望的答案是...

  • MediaRecorder仅使用第一个匹配的编码器,就像使用MediaRecorder
  • MediaRecorder明确首选硬件编码器
  • 其他地方

2 个答案:

答案 0 :(得分:1)

MediaRecoders本机实现是StagefrightRecorder.cpp。 在方法setupVideoEncoderline #1782中,您可以看到它正在使用Option Explicit Sub OpenFiles() Dim Current As Worksheet Set Current = ActiveSheet Dim files As New Collection Dim file files.Add "A:\Files\My Stuff\05 May 2019 - Master.xlsx" files.Add "A:\Files\My Stuff\06 June 2019 - Master.xlsx" files.Add "A:\Files\My Stuff\07 July 2019 - Master.xlsx" For Each file In files Debug.Print "Fetching file " & file If isFileOpen(CStr(file)) Then Debug.Print file & " is already open :) " Else Call GetFile(CStr(file), False) End If Next Current.Activate Set Current = Nothing MsgBox ("Finished!") End Sub Private Function isFileOpen(fullPath$) As Boolean Dim wb As Workbook On Error Resume Next Set wb = Workbooks(Dir(fullPath)) If Err.Number = 0 Then isFileOpen = True End Function Private Sub GetFile(fullPath$, readOnly As Boolean) ' No error handling here, this SHOULD raise an error if the file can't ' be opened for any reason (invalid path, locked/in-use unless readOnly=True, etc. Debug.Print "Attempting to open " & fullPath Workbooks.Open fullPath, readOnly:=readOnly End Sub ,其格式为'video / avc'作为'mime'(#1660行)。

MediaCodecSource.cpp的initEncoder方法的line #515中,选择了最合适的编码器。

如何找到编解码器here

我希望这有助于浏览android的本地媒体影响。

答案 1 :(得分:1)

与此相关的其他想法,以及与Media的其他合作。其中使用了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在本机部分执行MediaRecorder之后,在JNI native_setup中委托JMediaCodec来执行本机部分,该操作委托了本机部分与MediaCodec。此实现使用参考ACodec是最有趣的地方。

在这里您可以找到MediaCodecList和外部媒体服务,编解码器分配的使用,最后是OMXCodec的使用情况,其中发生了所有选择和匹配请求。因此,通过其他实现IMediaPlayerServiceMediaCodecList中检索了相同的编解码器列表,其中包含有关可用编解码器名称的信息。我稍后可以检查,我们还能找到什么。


更新。因此,我们发现的内容与问题的确切答案不同。但是,您需要的所有魔术都位于几个文件中。 1)可以在OMXCodec中找到编解码器的用法和部分选择(编解码器之间的比较器,等等)。 2)MediaCodecList中具有辅助功能的编解码器列表,最后3)IMediaPlayerService的实现包含完整的未排序编解码器及其功能。