Android provides a way to query the supported encoding profiles. But when setting up an encoder I cannot find the way to specify the desired profile to be used.
Finding supported profile/level pairs
Using the MediaCodec
API in android you can call getCodecInfo()
once you have chosen an encoder component. This returns a MediaCodecInfo
object which provides details about the codec component being used. getCapabilitiesForType()
returns a CodecCapabilities
object, detailing what the codec is capable of. This contains an array of CodecProfileLevels which detail the supported profiles and levels which are supported.
Trying to set the profile
I can't see a field to set the profile for MedieCodec
or for the MediaFormat
.
There is a KEY_AAC_PROFILE
for MediaFormat
, but in the reference it explicitly states this is for aac audio only.
In MediaCodec
there is a way to pass a Bundle
of extra parameters to the codec using setParameters()
. This looks like it has no generic documentation, and the parameters which are accepted will be different between codecs (different devices).
Background
Profiles specify a set of encoding features to use. Simple profiles are less computationally intense, but generally sacrifice quality for a given bit rate as a result. The levels specify the maximum resolution / bit-rate which are supported for a given profile. I expected levels usually to be associated with decoding capability, but since it is describing a hardware encoder which has to run in real time, having a maximum setting makes sense to me.
META: (I originally had a lot more links to each class + function I mentioned, but I had to remove them because I don't yet have the rep to post more than 2 links.)
For Android Kitkat devices we can set desired AVC profile and level into media format as per code snippet below(sets baseline with level 1.3). Please set this before starting MediaCodec.
format.setInteger(MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileBaseline);
format.setInteger(MediaFormat.KEY_LEVEL, MediaCodecInfo.CodecProfileLevel.AVCLevel13);