一种有损的音频压缩格式。,AAC音频格式有两种类型:
- ADIF 音频数据交换格式
- ADTS 音频数据传输流
ADTS
可以在任意帧解码,每一帧都拥有头信息。ADTS Header + AAC ES共同组成了一个完整的ADTS帧。ADTS Header可以是7个字节或9个字节,包含了采样率、通道数、帧长度等信息。
csd-0参数
AAC编解码中csd-0表示ADTS头文件,是通过AAC的Profile、采样率、通道数算出来的。比如常见的44100采样率、双声道、LC计算出来的byte字节为18,16。在通过MedaiCodec解码AAC裸流时,需要设置csd-0,否则会解析失败。如果有需要还需要设置KEY_IS_ADTS
为1,用来表明每帧的头部都带有ADTS头文件,注意改参数只用在解码的时候,也就是编码是不需要的。
//解码的是AAC音频且带有 ADTS header,则必须将KEY_IS_ADTS重置为1,否则后面获取解码后的ByteBuffer会一直为-1
mMediaFormat.setInteger(MediaFormat.KEY_IS_ADTS, 1)
csd-0计算方式:
int audioProfile = 2; //表示LC
int sampleIndex = 4; //44100
int channelConfig = 2; //2
byte[] adtsAudioHeader = new byte[2];
adtsAudioHeader[0] = (byte) ((audioProfile << 3) | (sampleIndex >> 1));
adtsAudioHeader[1] = (byte) ((byte) ((sampleIndex << 7) & 0x80) | (channelConfig << 3));
当解码aac文件时,通过MediaFormat可以获取adts头文件,然后设置到创建MediaCodec的MediaFormat中。
当通过AAC编码时,在MediaCodec.INFO_OUTPUT_FORMAT_CHANGED
中可以获取到MediaFormat,然后获取adts头文件。
val adtsBuffer = format.getByteBuffer("csd-0")
标签:AAC,csd,解码,ADTS,byte,音频
From: https://blog.51cto.com/u_16348220/8250058