// // Created by 倪路朋 on 9/20/24. // #include #include "audio_channel.h" #include "macro.h" #include "pusher/live_pusher.h" #include "server_global.h" AudioChannel::AudioChannel() { } AudioChannel::~AudioChannel() { DELETE(buffer); if(audioEncoder){ faacEncClose(audioEncoder); audioEncoder = 0; } } void AudioChannel::initAudioEncoder(int sample_rate, int channels) { mChannels = channels; audioEncoder = faacEncOpen(static_cast(sample_rate),static_cast(channels),&inputSamples,&maxOutputBytes); //输出缓冲区 buffer = new u_char[maxOutputBytes]; if(!audioEncoder){ LOGE("打开音频编码器失败"); return; } //配置编码参数 faacEncConfigurationPtr config = faacEncGetCurrentConfiguration(audioEncoder); //mpeg4标准 config->mpegVersion = MPEG4; // config->aacObjectType = LOW; //输入格式16位 config->inputFormat = FAAC_INPUT_16BIT; //输出格式 config->outputFormat = 0; int ret = faacEncSetConfiguration(audioEncoder,config); if(!ret){ LOGE("音频编码器参数配置失败"); return; } } void AudioChannel::encodeData(int8_t *data) { int byteLen = faacEncEncode(audioEncoder,reinterpret_cast(data),inputSamples,buffer,maxOutputBytes); if(byteLen > 0){ RTMPPacket *pPacket = allocPacket(byteLen, 0x01, buffer); audioCallback(pPacket); } } RTMPPacket *AudioChannel::getAudioSeqHeader() { u_char *buf; u_long len; faacEncGetDecoderSpecificInfo(audioEncoder, &buf, &len); return allocPacket(len,0x00,buf); } RTMPPacket *AudioChannel::allocPacket(int byteLen,char m_type,u_char *buffer) { RTMPPacket *packet = new RTMPPacket ; int body_size = 2 + byteLen; RTMPPacket_Alloc(packet,body_size); packet->m_body[0] = 0xAF;//双声道 if(mChannels == 1){ packet->m_body[0] = 0xAE;//单声道 } //音频数据 packet->m_body[1] = m_type; memcpy(&packet->m_body[2],buffer,static_cast(byteLen)); packet->m_headerType = RTMP_PACKET_SIZE_LARGE; packet->m_packetType = RTMP_PACKET_TYPE_AUDIO; packet->m_nBodySize = body_size; packet->m_nChannel = 0x05; packet->m_nTimeStamp = -1; packet->m_hasAbsTimestamp = 0; return packet; } void AudioChannel::setAudioCallback(AudioChannel::AudioCallback audioCallback) { this->audioCallback = audioCallback; }