В Android ACodec.cpp setupAVCEncoderParameters
, он читает profile
и level
из msg
(msg->findInt32("profile", &profile)
/msg->findInt32("level", &level)
), то msg
кажется, приходит из format
в MediaCodec.configure()
. Так что, я думаю, что мы можем установить profile
/level
вручную перед MediaCodec.configure()
, как показано ниже:Какой профиль/уровень AVC будет установлен в Android MediaCodec, если мы не установим это значение вручную?
format.setInteger(MediaCodec.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileHigh);
format.setInteger(MediaCodec.KEY_LEVEL, MediaCodecInfo.CodecProfileLevel.AVCLevel5);
Конечно, я согласен, что это не очень хорошая идея, потому что мы не konw, если наше устройство поддерживает профиль/уровень мы устанавливаем , А также я нахожу, что в большинстве случаев код вообще не устанавливал эти значения.
Например:
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 запрашивать, какое текущее устройство на уровне профиля/уровня поддерживает и автоматически выбирает его? Если устройство поддерживает более одного профиля/уровня, какой из них будет выбран? Нижний уровень один (базовый, например) или более высокий уровень один (высокий, например)?