【音頻編碼】AAC編碼之FDK AAC

近期需要做AAC編碼,看了下幾個開源的AAC編碼庫,綜合考慮,最終選了fdk aac編碼庫。主要有以下幾點原因:

1. 開源、音質好(目前認爲是開源AAC編碼器裏音質最好的)
2. 音質,順序大概是libfdk_aac>libfaac>aac>libvo_aacenc
3. 支持LC-AAC、HE-AAC、HE-AAC V2等多種編碼


下載鏈接

http://www.linuxfromscratch.org/blfs/view/svn/multimedia/fdk-aac.html

 

編譯安裝

目前是在ubuntu下運行程序。我使用的是Ubuntu 14.04,其他linux發行版類似。將下載的文件解壓,Terminal進入解壓目錄,“./configure”執行默認配置,然後“make”,最後“make install”即可。


代碼編寫

使用FDK AAC庫進行編碼比較簡單,主要是Encoder初始化和編碼兩大部分。

Encoder初始化:

1.調用aacEncOpen()來分配所需配置的編碼器實例。函數原型:
aacEncOpen(HANDLE_AACENCODER *phAacEncoder, const UINT encModules, const UINT maxChannels)
    
2.調用aacEncoder_SetParam()來設置編碼參數,AOT、採樣率、通道模式、比特率和傳輸類型都是必需設置的。函數原型:
aacEncoder_SetParam(const HANDLE_AACENCODER hAacEncoder, const AACENC_PARAM param, const UINT value)
    
部分代碼示例:

	if (aacEncoder_SetParam(paac_context->handle, AACENC_AOT, paac_context->aacenc_type) != AACENC_OK) {
		printf("Unable to set the AOT\n");
		goto error;
	}
	
	if (aacEncoder_SetParam(paac_context->handle, AACENC_SBR_MODE, paac_context->sbr_enable) != AACENC_OK) { 
		printf("Unable to set the SBR MODE enable\n");
		goto error;
	}
	
	if (aacEncoder_SetParam(paac_context->handle, AACENC_SAMPLERATE, paac_context->sampleRate) != AACENC_OK) {
		printf("Unable to set the AOT\n");
		goto error;
	}
	if (aacEncoder_SetParam(paac_context->handle, AACENC_CHANNELMODE, paac_context->enc_ch) != AACENC_OK) {
		printf("Unable to set the channel mode\n");
		goto error;
	}
	
	if (aacEncoder_SetParam(paac_context->handle, AACENC_CHANNELORDER, paac_context->input_ch_order) != AACENC_OK) {
		printf("Unable to set the channel order\n");
		goto error;
	}
	
	if (aacEncoder_SetParam(paac_context->handle, AACENC_BITRATEMODE, paac_context->bit_rate_mode) != AACENC_OK) {
		printf("Unable to set the bit_rate_mode\n");
		goto error;
	}
	
	if (aacEncoder_SetParam(paac_context->handle, AACENC_BITRATE, paac_context->bit_rate) != AACENC_OK) {
		printf("Unable to set the bitrate\n");
		goto error;
	}
	if (aacEncoder_SetParam(paac_context->handle, AACENC_TRANSMUX, paac_context->aac_format) != AACENC_OK) {
		printf("Unable to set the ADTS transmux\n");
		goto error;
	}

3.用NULL參數調用aacEncEncode()來初始化編碼器實例和現有的參數集。函數原型:    
aacEncEncode(const HANDLE_AACENCODER hAacEncoder, const AACENC_BufDesc *inBufDesc, const AACENC_BufDesc *outBufDesc, const AACENC_InArgs *inargs, AACENC_OutArgs *outargs)

部分代碼示例:

	if (aacEncEncode(paac_context->handle, NULL, NULL, NULL, NULL) != AACENC_OK) {
		printf("Unable to initialize the encoder\n");
		goto error;
	}


4.調用aacEncInfo()獲取關於當前編碼器實例的信息。函數原型:
aacEncInfo(const HANDLE_AACENCODER hAacEncoder, AACENC_InfoStruct *pInfo)
        
部分代碼示例:

	if (aacEncInfo(paac_context->handle, &info) != AACENC_OK) {
		printf("Unable to get the encoder info\n");
		goto error;
	}

 

編碼部分:

4.在循環中對輸入音頻數據進行編碼。併爲aacEncEncode()提供輸入/輸出參數。將輸出數據寫入文件或音頻設備。

5.調用aacEncClose()並銷燬編碼器實例。

部分代碼示例:

	if ((aacEncEncode(paac_context->handle, &in_buf, &out_buf, &in_args, &out_args)) != AACENC_OK) {
		printf("Encoding aac failed\n");
		return -2;
	}
	if (out_args.numOutBytes == 0)
	{
		printf("Encoding aac out size is 0\n");
		return -3;
	}
	fwrite(m_aacOutbuf, 1, out_args.numOutBytes, outstream);
	aacEncClose(&paac_context->handle);

 

我寫的示例程序:

https://download.csdn.net/download/caiwenbin1101517886/10669383

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章