3

在 Android ACodec.cppsetupAVCEncoderParameters中,它从( / )读取profile和读取,似乎来自in 。所以,我认为我们可以像下面这样手动设置/之前:levelmsgmsg->findInt32("profile", &profile)msg->findInt32("level", &level)msgformatMediaCodec.configure()profilelevelMediaCodec.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 会查询当前设备支持的配置文件/级别并自动选择一个吗?如果设备支持多个配置文件/级别,将选择哪一个?较低级别的(例如基线)还是较高级别的(例如高级别)?

4

1 回答 1

3

在大多数情况下(据我所知),它将是基线,因为更高的配置文件(启用 B 帧)要求您作为调用者准备正确处理它(一个琐碎/幼稚的应用程序可能有假设不' t 支持 B 帧),并且具有 B 帧的编码器具有更高的延迟。

于 2016-12-30T10:27:49.963 回答