2016-12-29 14 views
1

В 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 запрашивать, какое текущее устройство на уровне профиля/уровня поддерживает и автоматически выбирает его? Если устройство поддерживает более одного профиля/уровня, какой из них будет выбран? Нижний уровень один (базовый, например) или более высокий уровень один (высокий, например)?

ответ

1

В большинстве случаев (насколько я знаю) это будет базовая линия, поскольку более высокие профили (с включенными B-кадрами) требуют от вас, чтобы вызывающий абонент был готов к его правильной обработке (тривиальное/наивное приложение может иметь предположения, которые не задерживаются с B-кадрами), и кодер с B-кадрами имеет более высокую задержку.