最近在看人工智能相关的知识,无意中发现了一个巨牛的 人工智能教程,分享一下给大家。
教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点 这里 可以直接看教程。
简介
本次分享使用 faad2 解码 AAC 音频文件, 将 AAC 文件转换为 WAV 文件并使用 AVAudioPlayer 进行播放。
在博文 音视频编程: 简单分析 WAV 文件 给大家简单的分析了一下 WAV 的数据头协议, 其实也是为了这篇博文来服务的, 所以阅读本文之前, 建议先看上文。
该系列博文:
音视频编程: iOS 使用 faad2 (本篇)
例子介绍
本文以一个实际的例子, 使用 faad2的各个函数来解码 AAC 数据.
主要有以下几个步骤:
- 获取输入文件
- 获取 faad 解码器句柄
- 初始化 faad 解码器
- 根据文件解析文件帧, 并写入输出文件中
- 写入文件头将其封装为 WAV 格式的音频文件
- 关闭 faad 解码器句柄
工程实战
引入 faad2
将编译好的 faad2 导入工程即可.
其中关键的 API 在 neaacdec.h 中有描述.
工程效果图:
编码实现
在 音视频编程: 简单分析 WAV 文件 中已经定义了 WAV 的数据头.
1 | struct MZWavAudioFileHeader |
现在实现写入数据头的方法 mz_write_wav_header
1 | /** |
解码主要用到了 FAAD2 中的 NeAACDecDecode
函数. 函数原型如下:
1 | void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hDecoder, |
对应帧定义的结构体: NeAACDecFrameInfo
, 定义如下:
1 | typedef struct NeAACDecFrameInfo |
具体的解码实现, 我放到了 Github 上面了, 大家可以去 这里 查看.
麻烦
解码 aac, 解决采样频率和通道数不对的问题
1 | //防止采样频率加倍 |
1 | //从双声道的数据中提取单通道 |
具体可以查阅 FAAD2 的源码. 感谢 使用FAAD库解码AAC实例及 及 faad解码后的通道数不正确的问题 提供.