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-11C++運(yùn)算符重載 成員函數(shù)與友元函數(shù)詳解
以下是對(duì)C++運(yùn)算符重載 成員函數(shù)與友元函數(shù)進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下2013-07-07C++中實(shí)現(xiàn)OpenCV圖像分割與分水嶺算法
分水嶺算法是一種常用的圖像區(qū)域分割法,本文主要介紹了OpenCV圖像分割與分水嶺算法,使用C++實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2021-06-06C語(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í)例化原理