下面代码理解为音频编码器上下文
- (BOOL)init_faac_encoder_with_config:(XC_AudioEncode_Faac_Config *)config{
mChannels = config.channels;
audioCodec = faacEncOpen(config.sample_rate, config.channels, &inputSamples, &maxOutputBytes);
faacEncConfigurationPtr config_faac = faacEncGetCurrentConfiguration(audioCodec);
config_faac->mpegVersion = MPEG4;
config_faac->aacObjectType = LOW;
config_faac->inputFormat = FAAC_INPUT_16BIT;
config_faac->outputFormat = 0; /* Bitstream output format (0 = Raw; 1 = ADTS) */
int ret = faacEncSetConfiguration(audioCodec, config_faac);
buffer = (uint8_t *)malloc(maxOutputBytes);
if (!ret) {
is_init_success = NO;
}else{
is_init_success = YES;
}
input_buffer = (uint8_t *)malloc(inputSamples);
return is_init_success;
}
faac进行音频编码并将编码后的数据写入rtmppacket
- (BOOL)encode_audio_aac_with_pcmframe:(uint8_t *)pcmframe with_callback:(get_encode_callback)callback{
self.callback = callback;
int bytelen = faacEncEncode(audioCodec, (int32_t *)(pcmframe), (unsigned int)inputSamples, buffer,
(unsigned int)maxOutputBytes);
if (bytelen > 0) {
int bodySize = 2 + bytelen;
XCQueueObj *obj = [[XCQueueObj alloc]init];
obj->rtmp_packet = (RTMPPacket *)malloc(sizeof(RTMPPacket));
RTMPPacket_Alloc( obj->rtmp_packet, bodySize);
obj->rtmp_packet->m_body[0] = 0xAF;
if (mChannels == 1) {
obj->rtmp_packet->m_body[0] = 0xAE;
}
obj->rtmp_packet->m_body[1] = 0x01;
memcpy(& obj->rtmp_packet->m_body[2], buffer, bytelen);
obj->rtmp_packet->m_hasAbsTimestamp = 0;
obj->rtmp_packet->m_nBodySize = bodySize;
obj->rtmp_packet->m_packetType = RTMP_PACKET_TYPE_AUDIO;
obj->rtmp_packet->m_nChannel = 0x11;
obj->rtmp_packet->m_headerType = RTMP_PACKET_SIZE_LARGE;
self.callback(obj);
}
return YES;
}
关于为什么是AF或者AE 会在格式说明的博客中进行说明 AF代表什么AE 代表什么
如果要写入文件使用下面的代码
- (BOOL)encode_audio_aac_with_pcmframe:(uint8_t *)pcmframe with_aacfile:(FILE*)aac_file{
int bytelen = faacEncEncode(audioCodec,
(int32_t *)(pcmframe),
(unsigned int)inputSamples,
buffer,
(unsigned int)maxOutputBytes);
//config_faac->outputFormat = 1; /* Bitstream output format (0 = Raw; 1 = ADTS) */
if (bytelen > 0) {
fwrite(buffer, 1, bytelen, aac_file);
fflush(aac_file);
}
return YES;
}
config_faac->outputFormat = 1;如果要输出文件这里需要制定为1 ,1表示编码后的数据时带有ADTS头的,0表示不带有ADTS头是裸数据