65.9K
CodeProject 正在变化。 阅读更多。
Home

AMR 音频编码

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2012年2月18日

CPOL

3分钟阅读

viewsIcon

69723

downloadIcon

4104

使用 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 编码数据流程图

数据流程图如下

amrencode

软件详情

有关 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
© . All rights reserved.