Android API 33中HE-AAC V1音频编码及新MIME类型有效性确认
在Android API 33中使用MIMETYPE_AUDIO_AAC_HE_V1调用createEncoderByType的合法性
结论
在Android API 33(Tiramisu)中,可以直接使用MediaFormat.MIMETYPE_AUDIO_AAC_HE_V1调用MediaCodec.createEncoderByType()方法,你提供的代码是合法的。
原因解析
API 33新增的MIMETYPE_AUDIO_AAC_HE_V1是专门用于标识HE-AAC v1编码格式的MIME类型,它的作用等价于旧版本中使用MediaFormat.MIMETYPE_AUDIO_AAC配合MediaFormat.KEY_AAC_PROFILE设置为MediaCodecInfo.CodecProfileLevel.AACObjectHE的写法——两者最终都会指向系统中的HE-AAC v1编码器。
注意事项
- 版本兼容性:该MIME类型仅在API 33及以上版本存在,直接在低版本设备上调用会抛出
NoSuchFieldError,因此实际开发中必须添加版本判断分支,兼容低版本实现。 - 必要参数配置:即使使用新MIME类型,创建
MediaFormat时仍需指定采样率、声道数等核心参数,仅靠MIME类型无法完成编码器的完整配置。
示例兼容代码
import android.media.MediaCodec; import android.media.MediaCodecInfo; import android.media.MediaFormat; import android.os.Build; // ... if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // API 33及以上使用新MIME类型 codec_ = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC_HE_V1); MediaFormat format = MediaFormat.createAudioFormat( MediaFormat.MIMETYPE_AUDIO_AAC_HE_V1, sampleRate, channelCount ); // 可选:设置比特率等参数 format.setInteger(MediaFormat.KEY_BIT_RATE, 128000); codec_.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); } else { // 低版本使用原有兼容写法 codec_ = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC); MediaFormat format = MediaFormat.createAudioFormat( MediaFormat.MIMETYPE_AUDIO_AAC, sampleRate, channelCount ); format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectHE); format.setInteger(MediaFormat.KEY_BIT_RATE, 128000); codec_.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); }
内容的提问来源于stack exchange,提问作者olojzyg
相关产品推荐
相关产品推荐

