Windows上使用vs編譯fdk-aac的教程詳解
前言
有時(shí)需要在Windows上用到fdk-aac,fdk-aac是源碼是cmake的,可以直接轉(zhuǎn)成vs項(xiàng)目,而且在Shift Media Project中有提供vs版的源碼,我們直接下載下來(lái)就可以編譯。
一、獲取源碼
在Shift Media Project的github中就可以找到最新的fdk-aac的vs項(xiàng)目源碼:
https://github.com/ShiftMediaProject/fdk-aac

下載完成后直接找到SMP目錄。

打開(kāi)sln即可以編譯了。

二、使用示例
將wav文件編碼成acc文件,其中WavFileReader對(duì)象參考:《C++ 讀取wav文件中的PCM數(shù)據(jù)》
#include<stdio.h>
#include"aacenc_lib.h"
#include"WavFileReader.h"
void main(int argc, char* argv[])
{
FILE* f;
AC::WavFileReader wr;
HANDLE_AACENCODER encoder;
unsigned char buffer1[2048], buffer2[2048];
int readBytes ;
//打開(kāi)文件
f = fopen("./out.aac", "wb+");
if (!f)
{
printf("aac file create error!\n");
goto end;
}
//wav文件聲音格式為44100 2 16
if (!wr.OpenWavFile("test_music.wav"))
{
printf("wav file open error!\n");
goto end;
}
//初始化編碼器
if (aacEncOpen(&encoder, 0, 2) != AACENC_OK) {
printf("encoder open error!\n");
goto end;
}
if (aacEncoder_SetParam(encoder, AACENC_SAMPLERATE, 44100) != AACENC_OK) {
printf("set samplerate error!\n");
goto end;
}
if (aacEncoder_SetParam(encoder, AACENC_BITRATE, 128*1024) != AACENC_OK) {
printf("set bitrate error!\n");
goto end;
}
if (aacEncoder_SetParam(encoder, AACENC_SBR_MODE, 0) != AACENC_OK) {
printf("set sbr_mode error!\n");
goto end;
}
if (aacEncoder_SetParam(encoder, AACENC_AOT, AOT_AAC_LC) != AACENC_OK) {
printf("set aot error!\n");
goto end;
}
if (aacEncoder_SetParam(encoder, AACENC_CHANNELMODE, MODE_2) != AACENC_OK) {
printf("set channelmode error!\n");
goto end;
}
if (aacEncoder_SetParam(encoder, AACENC_CHANNELORDER, 1) != AACENC_OK) {
printf("set channelorder error!\n");
goto end;
}
if (aacEncoder_SetParam(encoder, AACENC_BITRATEMODE, 0) != AACENC_OK) {
printf("set bitratemode error!\n");
goto end;
}
if (aacEncoder_SetParam(encoder, AACENC_TRANSMUX, 2) != AACENC_OK) {
printf("set transmux error!\n");
goto end;
}
do {
//讀取wav的pcm數(shù)據(jù)
readBytes= wr.ReadData(buffer1,2048);
AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 };
AACENC_InArgs in_args = { 0 ,0 };
AACENC_OutArgs out_args = { 0 };
int in_identifier = IN_AUDIO_DATA;
int in_elem_size =2;
void* in_ptr = buffer1;
int out_identifier = OUT_BITSTREAM_DATA;
int out_size = 2048;
int out_elem_size = 1;
void* out_ptr = buffer2;
in_args.numInSamples = readBytes / 2;
in_buf.numBufs = 1;
in_buf.bufs = (void**)&in_ptr;
in_buf.bufferIdentifiers = &in_identifier;
in_buf.bufSizes = &readBytes;
in_buf.bufElSizes = &in_elem_size;
out_buf.numBufs = 1;
out_buf.bufs = (void**)&out_ptr;
out_buf.bufferIdentifiers = &out_identifier;
out_buf.bufSizes = &out_size;
out_buf.bufElSizes = &out_elem_size;
//編碼
if ((aacEncEncode((encoder), &in_buf, &out_buf, &in_args, &out_args)) != AACENC_OK) {
printf("encode error!\n");
goto end;
}
if (out_args.numOutBytes > 0)
//寫(xiě)入文件
{
fwrite(buffer2, 1, out_args.numOutBytes, f);
}
}
while (readBytes > 0);
end:
if(encoder)
aacEncClose((HANDLE_AACENCODER*)(&encoder));
if(f)
fclose(f);
}
到此這篇關(guān)于Windows上使用vs編譯fdk-aac的教程詳解的文章就介紹到這了,更多相關(guān)Windows編譯fdk-aac內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++類(lèi)成員函數(shù)如何做函數(shù)參數(shù)
這篇文章主要介紹了c++類(lèi)成員函數(shù)如何做函數(shù)參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
C++運(yùn)算符重載 成員函數(shù)與友元函數(shù)詳解
以下是對(duì)C++運(yùn)算符重載 成員函數(shù)與友元函數(shù)進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下2013-07-07
C++中實(shí)現(xiàn)OpenCV圖像分割與分水嶺算法
分水嶺算法是一種常用的圖像區(qū)域分割法,本文主要介紹了OpenCV圖像分割與分水嶺算法,使用C++實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2021-06-06
C語(yǔ)言格式輸出二進(jìn)制的2種方法總結(jié)
眾所周知C中以八進(jìn)制,十進(jìn)制和十六進(jìn)制都可以通過(guò)%o,%d和%x輕松實(shí)現(xiàn),然而唯獨(dú)沒(méi)有提供二進(jìn)制輸出的快速方式,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言格式輸出二進(jìn)制的2種方法,需要的朋友可以參考下2022-08-08
初識(shí)C++?Vector模板與實(shí)例化原理

