本文主要讲解:如何将AAC编码后的数据解码成PCM。
命令行
用法非常简单:
ffmpeg -c:a libfdk_aac -i in.aac -f s16le out.pcm
-
-c:a libfdk_aac
- 使用fdk-aac解码器
- 需要注意的是:这个参数要写在aac文件那边,也就是属于输入参数
-
-f s16le
- 设置PCM文件最终的采样格式
编程
需要用到2个库:
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavutil/avutil.h>
}
#define ERROR_BUF(ret) \
char errbuf[1024]; \
av_strerror(ret, errbuf, sizeof (errbuf));
函数声明
我们最终会将AAC解码的操作封装到一个函数中。
// 解码后的PCM参数
typedef struct {
const char *filename;
int sampleRate;
AVSampleFormat sampleFmt;
int chLayout;
} AudioDecodeSpec;
class FFmpegs {
public:
FFmpegs();
static void aacDecode(const char *inFilename,
AudioDecodeSpec &out);
};
函数实现
变量定义
// 输入缓冲区的大小
#define IN_DATA_SIZE 20480
// 需要再次读取输入文件数据的阈值
#define REFILL_THRESH 4096
// 返回结果
int ret = 0;
// 每次从输入文件中读取的长度
int inLen = 0;
// 是否已经读取到了输入文件的尾部
int inEnd = 0;
// 用来存放读取的文件数据
// 加上AV_INPUT_BUFFER_PADDING_SIZE是为了防止某些优化过的reader一次性读取过多导致越界
char inDataArray[IN_DATA_SIZE + A