void ZAAC::Init(ZFLV *flv,ZMP4 *mp4)//,ZRTMP*rtmp) { m_flv=flv; m_mp4=mp4; //m_rtmp=rtmp; nSampleRate = 44100; // 采样率 nChannels = 2; // 声道数 nPCMBitSize = 16; // 单样本位数 ULONG nInputSamples = 0;//样本数 nMaxOutputBytes = 0; ULONG nPCMByteSize=0; hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes); pConfiguration = faacEncGetCurrentConfiguration(hEncoder); pConfiguration->inputFormat = FAAC_INPUT_16BIT; pConfiguration->outputFormat=0;//0raw 1adst pConfiguration->useTns=true; pConfiguration->useLfe=false; pConfiguration->aacObjectType=LOW; pConfiguration->shortctl=SHORTCTL_NORMAL; pConfiguration->quantqual=100; pConfiguration->bandWidth=0; pConfiguration->bitRate=0; faacEncSetConfiguration(hEncoder, pConfiguration); nPCMByteSize=nInputSamples*nPCMBitSize/8; pbAACBuffer=(BYTE*)malloc(nMaxOutputBytes); UINT SampIndex=GetSRIndex(nSampleRate); FLVAACADST m_flvadst={0}; m_flvadst.OBjecttype=2; m_flvadst.SamplIndex1=SampIndex>>1&0x03; m_flvadst.SamplIndex2=SampIndex&0x01; m_flvadst.channel=nChannels; if(m_flv) m_flv->InitAAC((unsigned char*)&m_flvadst,2,clock()); if (m_mp4) m_mp4->InitAAC((unsigned char*)&m_flvadst,2,clock()); //if (m_rtmp) // m_rtmp->InitAAC((unsigned char*)&m_flvadst,2,clock()); IsPlay=true; }
faacEncHandle FAACAPI faacEncOpen(unsigned long sampleRate, unsigned int numChannels, unsigned long *inputSamples, unsigned long *maxOutputBytes) { unsigned int channel; faacEncHandle hEncoder; *inputSamples = FRAME_LEN*numChannels; *maxOutputBytes = (6144/8)*numChannels; #ifdef DRM *maxOutputBytes += 1; /* for CRC */ #endif hEncoder = (faacEncStruct*)AllocMemory(sizeof(faacEncStruct)); SetMemory(hEncoder, 0, sizeof(faacEncStruct)); hEncoder->numChannels = numChannels; hEncoder->sampleRate = sampleRate; hEncoder->sampleRateIdx = GetSRIndex(sampleRate); /* Initialize variables to default values */ hEncoder->frameNum = 0; hEncoder->flushFrame = 0; /* Default configuration */ hEncoder->config.version = FAAC_CFG_VERSION; hEncoder->config.name = libfaacName; hEncoder->config.copyright = libCopyright; hEncoder->config.mpegVersion = MPEG4; hEncoder->config.aacObjectType = LTP; hEncoder->config.allowMidside = 1; hEncoder->config.useLfe = 1; hEncoder->config.useTns = 0; hEncoder->config.bitRate = 0; /* default bitrate / channel */ hEncoder->config.bandWidth = bwfac * hEncoder->sampleRate; if (hEncoder->config.bandWidth > bwbase) hEncoder->config.bandWidth = bwbase; hEncoder->config.quantqual = 100; hEncoder->config.psymodellist = (psymodellist_t *)psymodellist; hEncoder->config.psymodelidx = 0; hEncoder->psymodel = hEncoder->config.psymodellist[hEncoder->config.psymodelidx].model; hEncoder->config.shortctl = SHORTCTL_NORMAL; /* default channel map is straight-through */ for( channel = 0; channel < 64; channel++ ) hEncoder->config.channel_map[channel] = channel; /* by default we have to be compatible with all previous software which assumes that we will generate ADTS /AV */ hEncoder->config.outputFormat = 1; /* be compatible with software which assumes 24bit in 32bit PCM */ hEncoder->config.inputFormat = FAAC_INPUT_32BIT; /* find correct sampling rate depending parameters */ hEncoder->srInfo = &srInfo[hEncoder->sampleRateIdx]; for (channel = 0; channel < numChannels; channel++) { hEncoder->coderInfo[channel].prev_window_shape = SINE_WINDOW; hEncoder->coderInfo[channel].window_shape = SINE_WINDOW; hEncoder->coderInfo[channel].block_type = ONLY_LONG_WINDOW; hEncoder->coderInfo[channel].num_window_groups = 1; hEncoder->coderInfo[channel].window_group_length[0] = 1; /* FIXME: Use sr_idx here */ hEncoder->coderInfo[channel].max_pred_sfb = GetMaxPredSfb(hEncoder->sampleRateIdx); hEncoder->sampleBuff[channel] = NULL; hEncoder->nextSampleBuff[channel] = NULL; hEncoder->next2SampleBuff[channel] = NULL; hEncoder->ltpTimeBuff[channel] = (double*)AllocMemory(2*BLOCK_LEN_LONG*sizeof(double)); SetMemory(hEncoder->ltpTimeBuff[channel], 0, 2*BLOCK_LEN_LONG*sizeof(double)); } /* Initialize coder functions */ fft_initialize( &hEncoder->fft_tables ); hEncoder->psymodel->PsyInit(&hEncoder->gpsyInfo, hEncoder->psyInfo, hEncoder->numChannels, hEncoder->sampleRate, hEncoder->srInfo->cb_width_long, hEncoder->srInfo->num_cb_long, hEncoder->srInfo->cb_width_short, hEncoder->srInfo->num_cb_short); FilterBankInit(hEncoder); TnsInit(hEncoder); LtpInit(hEncoder); PredInit(hEncoder); AACQuantizeInit(hEncoder->coderInfo, hEncoder->numChannels, &(hEncoder->aacquantCfg)); HuffmanInit(hEncoder->coderInfo, hEncoder->numChannels); /* Return handle */ return hEncoder; }