如果我们不手动设置此值,Android MediaCodec中将设置哪个AVC配置文件/级别?

时间:2016-12-29 16:46:06

标签: android mediacodec android-hardware mediamuxer

在Android ACodec.cpp setupAVCEncoderParameters中,它从profilelevel / msgmsg->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会查询哪个配置文件/级别当前设备支持并自动选择一个?如果设备支持多个配置文件/级别,将选择哪一个?较低的一级(基线,例如)或较高的一级(高,例如)?

1 个答案:

答案 0 :(得分:1)

在大多数情况下(据我所知),它将是基线,因为更高的配置文件(启用了B帧)要求您作为调用者准备好正确处理它(一个琐碎/天真的应用程序可能有假设那些不支持B帧的人,而B帧编码器的延迟时间更长。