AMR 音频编码





5.00/5 (4投票s)
使用 opencore-amr 库将原始音频数据编码为 AMR-NB 音频
引言
这篇文章是关于音频捕获、编码和流媒体的第三篇文章。它描述了如何将捕获的 PCM 数据编码为 AMR 编码并写入音频文件。
背景
这篇文章面向对音频相关应用感兴趣的软件开发人员。 尤其适合对将音频文件编码和解码为 AMR 窄带编码感兴趣的音频软件开发人员。 除非你想手动解码捕获的数据,否则无需了解 AMR 编码和解码的详细信息。
整个应用程序是用 "C" 语言编写的,它由简单的函数、简单的 PortAudio 库和 opencore-amr
库调用组成。 任何工作了一段时间的人都可以理解这个程序。
Port-Audio
Port-Audio 是一个免费的、跨平台的 开源 音频 I/O 库。 它允许您用 'C' 或 C++ 编写简单的音频程序,这些程序可以在包括 Windows、Macintosh OS X 和 Unix (OSS/ALSA) 在内的许多平台上编译和运行。 它的目的是促进不同平台上开发人员之间音频软件的交流。 Port Audio 软件有很多有用的例子。
官方网站是 http://www.portaudio.com。
Opencore-AMR
OpenCORE 框架实现自适应多速率窄带和宽带 (AMR-NB 和 AMR-WB) 语音编解码器的库。 VisualOn 实现自适应多速率宽带 (AMR-WB) 编码器和高级音频编码 (AAC) 编码器的库。
官方 opencore amr 网站是 http://sourceforge.net/projects/opencore-amr/ 或 http://opencore-amr.sourceforge.net/。
AMR 编码数据流程图
数据流程图如下
软件详情
有关 port audio 调用的更多详细信息,请参阅 port-audio 文档,以及 AMR 窄带,请参阅 opencore-amr 文档。
步骤 1:初始化 Port Audio 并注册录制回调函数
初始化 port audio 并使用录制回调函数打开 port audio 流,其配置如下:8000 采样率,16 位带符号 PCM 数据,帧大小为 80 个样本,即一帧 10 毫秒的音频数据。 启动流后,录制回调每 10 毫秒调用一次,并提供一帧音频数据。
步骤 2:初始化 AMR-NB 库
使用适当的配置参数初始化 opencore-amr
库以匹配 port-audio 捕获配置。通过调用其 Encoder_Interface_init
来初始化 opencore-amr
编码接口。
步骤 3:编码原始音频帧
当 port-audio 录制回调被调用时,原始音频数据存储在输入缓冲区中,将缓冲区和长度传递给 amr 编码器,amr 编码器返回编码后的数据。
通过调用 Encoder_Interface_Encode
函数,原始音频数据被转换为 amr-nb 编码数据。
步骤 4:写入文件
Amr-nb 音频具有标识二进制文件为 amr 音频文件的签名头。 如果没有这个 AMR 签名,amr 音频播放器就无法播放音频文件。
打开文件指针并首先将 AMR 签名 "#!AMR\n
" 写入二进制文件,并连续写入 AMR 编码数据。 在完成编码所有音频帧后关闭文件指针。
步骤 6:关闭 opencore-amr 库
关闭与 amr 库相关的所有资源。 opencore 退出函数如下 Encoder_Interface_exit
。
步骤 7:停止、关闭音频流并关闭 Port Audio
使用 Pa_CloseStream()
函数关闭流。
所需软件
需要以下软件才能执行和收听捕获的音频文件
- VC++、portaudio 库/dll
- opencore amr 库/dll 和
- 一个支持 amr-nb 的音频播放器 (VLC)
关注点
- 简单的 AMR 编码示例
历史
- 初始版本:Rev 1.0