音频的编解码使用MediaCodec的方法是很相似的,由于之前做的项目是要实现全双工通信,所以在手机录音编码之后发送给IPC端的同时,还要解码来自IPC端的音频数据并播放,因此学习了AAC编解码。MediaCodec的编解码能力还是有限的,如果需要做专业的音视频编解码最好是选用ffempeg,功能齐全,支持的格式也比较多。还是先来学习一下MediaCodec这个安卓自带的编解码工具吧!
跟编码一样,要解码首先初始化解码器,告诉它你需要解码的音频格式,是否带ADT头,如果带了,头的格式和内容是什么
private MediaCodec audioDecoder;//音频解码器
audioDecoder = MediaCodec.createDecoderByType("audio/mp4a-latm");
创建一个音频的解码器,初始化audioDecoder,具体的数据类型Type如下:
* <li>"video/x-vnd.on2.vp8" - VP8 video (i.e. video in .webm)
* <li>"video/x-vnd.on2.vp9" - VP9 video (i.e. video in .webm)
* <li>"video/avc" - H.264/AVC video
* <li>"video/hevc" - H.265/HEVC video
* <li>"video/mp4v-es" - MPEG4 video
* <li>"video/3gpp" - H.263 video
* <li>"audio/3gpp" - AMR narrowband audio
* <li>"audio/amr-wb" - AMR wideband audio
* <li>"audio/mpeg" - MPEG1/2 audio layer III
* <li>"audio/mp4a-latm" - AAC audio (note, this is raw AAC packets, not packaged in LATM!)
* <li>"audio/vorbis" - vorbis audio
* <li>"audio/g711-alaw" - G.711 alaw audio
* <li>"audio/g711-mlaw" - G.711 ulaw audio
根据具体需求选择Type来创建解码器,本例子解码的是AAC音频数据所以写入"audio/mp4a-latm"。
接下来是设置解码参数,使用MediaFormat来描述相关数据:
MediaFormat mediaFormat = MediaFormat.createAudio