In Android ACodec.cpp setupAVCEncoderParameters
, es profile
und level
von msg
(msg->findInt32("profile", &profile)
/msg->findInt32("level", &level)
) liest, wird die msg
von format
in MediaCodec.configure()
kommen zu werden. Also, ich denke, wir profile
/level
manuell vor MediaCodec.configure()
wie unten einstellen:Welches AVC Profil/Level wird in Android MediaCodec eingestellt, wenn wir diesen Wert nicht manuell einstellen?
format.setInteger(MediaCodec.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileHigh);
format.setInteger(MediaCodec.KEY_LEVEL, MediaCodecInfo.CodecProfileLevel.AVCLevel5);
Natürlich stimme ich zu, es ist keine gute Idee, weil wir konw nicht, ob unser Gerät unterstützt das Profil/Ebene setzen wir . Und ich finde auch, dass der meiste Beispielcode diese Werte überhaupt nicht gesetzt hat.
Zum Beispiel:
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);
Vielleicht werden sie automatisch eingestellt werden? Wird MediaCodec abfragen, welches Profil/Level das aktuelle Gerät unterstützt und eines automatisch auswählen? Wenn das Gerät mehr als ein Profil/Level unterstützt, welches wird ausgewählt? Das niedrigere Niveau Eins (Grundlinie, z.B.) oder das Höhere Niveau Eins (Hoch, z.B.) & alpha;