在Android ACodec.cpp setupAVCEncoderParameters
中,它从profile
(level
/ msg
)msg->findInt32("profile", &profile)
读取msg->findInt32("level", &level)
和msg
1}}似乎来自format
中的MediaCodec.configure()
。所以,我认为我们可以在profile
之前手动设置level
/ MediaCodec.configure()
,如下所示:
format.setInteger(MediaCodec.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileHigh);
format.setInteger(MediaCodec.KEY_LEVEL, MediaCodecInfo.CodecProfileLevel.AVCLevel5);
当然,我同意这不是一个好主意,因为如果我们的设备支持我们设置的配置文件/级别,我们就不会知道。而且我发现大多数示例代码都没有设置这些值。
例如:
MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); // API >= 18
format.setInteger(MediaFormat.KEY_BIT_RATE, calcBitRate());
format.setInteger(MediaFormat.KEY_FRAME_RATE, FRAME_RATE);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10)
mMediaCodec = MediaCodec.createEncoderByType(MIME_TYPE);
mMediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
也许他们会被自动设定? MediaCodec会查询哪个配置文件/级别当前设备支持并自动选择一个?如果设备支持多个配置文件/级别,将选择哪一个?较低的一级(基线,例如)或较高的一级(高,例如)?
答案 0 :(得分:1)
在大多数情况下(据我所知),它将是基线,因为更高的配置文件(启用了B帧)要求您作为调用者准备好正确处理它(一个琐碎/天真的应用程序可能有假设那些不支持B帧的人,而B帧编码器的延迟时间更长。