简介
本文分享如何将 WAV 格式的音频文件转换(编码)为 AAC 格式的音频文件并使用 AVAudioPlayer 播放编码后的文件.
这里的编码功能使用 faac 这个库来实现.
该系列博文:
函数介绍
获取 faac 的版本
1 | int FAACAPI faacEncGetVersion(char **faac_id_string, char **faac_copyright_string); |
示例:
1 | char *version; |
打印结果:
1 | FAAC version: 1.28, copyright: FAAC - Freeware Advanced Audio Coder (http://www.audiocoding.com/) |
打开并初始化 faac 编码器
1 | // sampleRate: 采样率 |
该函数返回一个 faac 编码器句柄. 其很多函数都需要这个句柄.
关闭 faac 编码器
1 | int FAACAPI faacEncClose(faacEncHandle hEncoder); |
将开启 faac 编码器返回的句柄传入即可.
获取配置和设置配置
1 | faacEncConfigurationPtr FAACAPI |
faac 的配置被定义为了一个结构体 faacEncConfiguration, 大家可以看源码.
编码(编码一帧音频数据)
1 | // hEncoder: faacEncOpen 返回的编码器句柄 |
实例
可以自己新建一个 iOS 工程.
准备好一个 wav
格式的音频文件.
效果如下图所示:
新建一个 C++ 文件, MZCodec.
MZCodec.hpp
1 | #ifndef MZCodec_hpp |
MZCodec.cpp
1 | #include "MZCodec.hpp" |
使用 MZCodec 的 Controller 需要命名为 .mm
文件.
ViewController.mm
1 | NSBundle *bundle = [NSBundle mainBundle]; |
编码过程需要点时间, 如果文件很大, 时间越久. 所以, 新开线程来进行编码.
编码完成后, 可在对应的沙盒目录找到 out.aac
文件.
注意事项
这个 aacObjectType
需要注意, 之前我在这里折腾了很久.
1 | pConfiguration->aacObjectType = LOW; |
如果设置为其他三种, 编码后的 aac 文件, AVAudioPlayer 播放不了, 初始化 AVAudioPlayer 就会报错, 报错信息如下: