Explicación detallada del encabezado ADTS del formato de audio AAC

        No hay forma de reproducir los datos AAC de la transmisión desnuda, porque el dispositivo no puede encontrar la información relevante del formato AAC; necesita agregar el encabezado ADTS para poder reproducir, y cada cuadro del paquete de audio tiene un encabezado ADTS , y el encabezado ADTS tiene 7 caracteres si no hay verificación de CRC Longitud de la sección, si hay verificación de CRC, tiene una longitud de 9 bytes.

 Protocolo de campo ADTS:

Protocolo de cabecera ADTS
campo longitud describir
palabra sinónima 12 bits Se corrigió 0xFFF, utilizado para sincronización, el comienzo de un cuadro
identificación 1bit Identificador MPEG, 0: MPEG-4, 1: MPEG-2
capa

2 bits

Generalmente 00
protección_ausente 1bit Indicador de verificación CRC, 0: con verificación CRC, 1: sin verificación CRC
perfil 2 bits

Nivel AAC, en AVStream de ffmpeg: streams[audio]->codecpar->profile

audio: índice de cuadro

índice_de_frecuencia_de_muestreo 4 bits

Subíndice de tasa de muestreo, la tasa de muestreo correspondiente al subíndice es la siguiente:

0: 96000 Hz
1: 88200 Hz
2 : 64000 Hz
3 : 48000 Hz
4 : 44100 Hz
5 : 32000 Hz
6 :
24000 Hz 7 : 22050 Hz
8 : 16000 Hz 9 : 12000 Hz 10 : 210 Hz 10 : 5011 : Reservado 14 : Reservado 15 : la frecuencia se escribe explícitamente La tasa de muestreo también está en el AVStream de ffmpeg:







streams[audio]->codecpar->sample_rate

audio: índice de cuadro

bit_privado 1bit Bit privado, 0 al codificar, ignorado al decodificar
configuración_del_canal 3 bits

声道数。
0: Definido en AOT Specifc Config
1: 1 canal : frontal - centro
2 : 2 canales : frontal - izquierdo, frontal - derecho
3 : 3 canales : frontal - central, frontal - izquierdo, frontal - derecho
4 : 4 canales : delantero - centro, delantero - izquierdo, delantero - derecho, trasero - centro
5 : 5 canales : delantero - centro, delantero - izquierdo, delantero - derecho, trasero - izquierdo, trasero - derecho
6 : 6 canales : delantero - centro, delantero - izquierdo, delantero - derecho, trasero - izquierdo, trasero - derecho, LFE - canal
7: 8 canales: delantero - central, delantero - izquierdo, delantero - derecho, lateral - izquierdo, lateral - derecho, trasero - izquierdo, trasero - derecha, LFE - canal
8 - 15:
Frente reservado - centro:中置声道

delantero - izquierdo: canal izquierdo

front - right:右声道

back - left:后置左

back - right:后置右

side - left:侧置左

side - right:侧置右

LFE - channel:低频声道

音频通道也在ffmpeg的AVStream中:

streams[audio]->codecpar->channels

audio:帧索引

orininal_copy 1bit 编码是设置为0,解码时忽略
home 1bit 编码时设置为0,解码时忽略
copyrigth_identification_bit 1bit 编码时设置为0,解码时忽略
copyrigth_identification_stat 1bit 编码时设置为0,解码时忽略
aac_frame_length 13bit 一个ADTS帧的⻓度,包括ADTS头和AAC原始流。
adts_bufferfullness 11bit 缓冲区充满度,0x7FF说明是码率可变的码流,不需要此字段。CBR可能需要此字段,不同编码器使用情况不同。具体查看附录。
number_of_raw_data_blocks_in_frame 2bit 表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧,为0表示说ADTS帧中只有一个AAC数据.
crc 16bit protection_absent为0就有该字段,否则没有该字段

        ffmpeg解复用时,MP4,FLV格式的包解出的音频流是纯AAC流,不带ADTS头数据,需要人工添加ADTS头。

        添加头的代码实现接口:

        

int adts_header(char *const p_adts_header, const int data_length,
		const int profile, const int samplerate,
		const int channels) {

	int sampling_frequency_index = 3; // 默认使用48000hz
	int adtsLen = data_length + 7;

	// 匹配采样率
	int frequencies_size = sizeof(sampling_frequencies) / sizeof(sampling_frequencies[0]);
	int i = 0;
	for (i = 0; i < frequencies_size; i++) {
		if (sampling_frequencies[i] == samplerate) {
			sampling_frequency_index = i;
			break;
		}
	}
	if (i >= frequencies_size) {
		std::cout << "没有找到支持的采样率" << std::endl;
		return -1;
	}

	p_adts_header[0] = 0xff;         //前12bit固定0xfff                          高8bits
	p_adts_header[1] = 0xf0;         //前12bit的低四位                          低4bits
	p_adts_header[1] |= (0 << 3);    //0:MPEG-4, 1:MPEG-2  1bit
	p_adts_header[1] |= (0 << 1);    //一般为0                                 2bits
	p_adts_header[1] |= 1;           //1:没有crc校验字段                    1bit

	p_adts_header[2] = (profile) << 6;            //aac级别,可以使用ffmpeg获取               2bits
	p_adts_header[2] |=
		(sampling_frequency_index & 0x0f) << 2; //可以使用ffgmpeg从包中获得  4bits
	p_adts_header[2] |= (0 << 1);             //私有位 编码时为0                   1bit
	p_adts_header[2] |= (channels & 0x04) >> 2; //3bit的声道设置的最高位  高1bit

	p_adts_header[3] = (channels & 0x03) << 6; //3bit的声道设置的最低两位 低2bits
	p_adts_header[3] |= (0 << 5);               //编码设置为0                1bit
	p_adts_header[3] |= (0 << 4);               //编码设置为0                    1bit
	p_adts_header[3] |= (0 << 3);               //编码设置为0        1bit
	p_adts_header[3] |= (0 << 2);               //编码设置为0      1bit
	p_adts_header[3] |= ((adtsLen & 0x1800) >> 11);           //帧长度包括ADTS头长度   高2bits

	p_adts_header[4] = (uint8_t) ((adtsLen & 0x7f8) >> 3);     //帧长度包括ADTS头长度    中间8bits
	p_adts_header[5] = (uint8_t) ((adtsLen & 0x7) << 5);       //帧长度包括ADTS头长度    低3bits
	p_adts_header[5] |= 0x1f;                                 //可变码率vbr:0x7ff 高5bits
	p_adts_header[6] = 0xfc;      //‭11111100‬       //buffer fullness:0x7ff 低6bits

	return 0;
}

代码中的sampling_frequencies[]数组是一个sampling_frequency_index字段的采样率对照表 。       

Supongo que te gusta

Origin blog.csdn.net/qq_39466755/article/details/127322079
Recomendado
Clasificación