C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > Windows编译fdk-aac

Windows上使用vs编译fdk-aac的教程详解

作者:CodeOfCC

有时需要在Windows上用到fdk-aac,fdk-aac是源码是cmake的,可以直接转成vs项目,下面就跟随小编一起学习一下如何在Windows上使用vs编译fdk-aac吧

前言

有时需要在Windows上用到fdk-aac,fdk-aac是源码是cmake的,可以直接转成vs项目,而且在Shift Media Project中有提供vs版的源码,我们直接下载下来就可以编译。

一、获取源码

在Shift Media Project的github中就可以找到最新的fdk-aac的vs项目源码:

https://github.com/ShiftMediaProject/fdk-aac

下载完成后直接找到SMP目录。

打开sln即可以编译了。

二、使用示例

将wav文件编码成acc文件,其中WavFileReader对象参考:《C++ 读取wav文件中的PCM数据》

#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 ;
	//打开文件
	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数据
		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)
			//写入文件
		{
			fwrite(buffer2, 1, out_args.numOutBytes, f);
		}
	}
	while (readBytes > 0);
end:
	if(encoder)
	aacEncClose((HANDLE_AACENCODER*)(&encoder));
	if(f)
	fclose(f);
}

到此这篇关于Windows上使用vs编译fdk-aac的教程详解的文章就介绍到这了,更多相关Windows编译fdk-aac内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文