开发者

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

开发者 https://www.devze.com 2023-11-19 12:23 出处:网络 作者: CodeOfCC
目录前言一、获取源码二、使用示例前言 有时需要在Windows上用到fdk-aac,fdk-aac是源码是cmake的,可以直接转成vs项目,而且在Shift Media Project中有提供vs版的源码,我们直接下载下来就可以编译。
目录
  • 前言
  • 一、获取源码
  • 二、使用示例

前言

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

一、获取源码

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

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

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

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

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

打开sln即可以编译了。

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

二、使用示例

将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;
	}js
	if (aacEnandroidcoder_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;
	}python
	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_IjavascriptnArgs 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内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号