有人知道MediaRecorder
使用哪种音频/视频编码器吗?
我知道我们可以使用mediaRecorder.setVideoEncoder()
和mediaRecorder.setAudioEncoder()
选择音频/视频mimeType:
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
但这不会告诉我正在使用哪种编码器实现,因为每个设备可以具有用于H264的多个编码器(例如,硬件加速的编码器和软件{{1} }。
有办法知道吗?
任何人都可以链接到我们可以发现它的本地源代码吗?
使用低级OMX.google.h264.encoder
时,我们可以通过MediaCodec
访问所有编码器,获取其名称和功能,最后实例化正确的MediaCodecList
。我敢肯定MediaCodec
在本机代码中也是如此,只是找不到任何源代码参考。谢谢!
我期望的答案是...
MediaRecorder
答案 0 :(得分:1)
MediaRecoders本机实现是StagefrightRecorder.cpp。
在方法setupVideoEncoder和line #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的使用情况,其中发生了所有选择和匹配请求。因此,通过其他实现IMediaPlayerService
从MediaCodecList中检索了相同的编解码器列表,其中包含有关可用编解码器名称的信息。我稍后可以检查,我们还能找到什么。
更新。因此,我们发现的内容与问题的确切答案不同。但是,您需要的所有魔术都位于几个文件中。 1)可以在OMXCodec中找到编解码器的用法和部分选择(编解码器之间的比较器,等等)。 2)MediaCodecList中具有辅助功能的编解码器列表,最后3)IMediaPlayerService
的实现包含完整的未排序编解码器及其功能。