1、README
a. 编译
编译demo
由于提供的.a静态库是在x86_64的机器上编译的,所以仅支持该架构的主机上编译运行。
$ make
编译opencore-amr
如果想要在其他架构的CPU上编译运行,可以使用以下命令(脚本)编译opencore-amr
[下载地址]得到相应的库文件进行替换:
#!/bin/bash
tar xzf opencore-amr-0.1.3.tar.gz
cd opencore-amr-0.1.3/
./configure --prefix=$PWD/_install # --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc
make -j96
make install
b. 使用
本示例是使用amr(nb)与pcm(8KHz,16bits,单/双声道)音频数据进行相互转化(编解码),使用如下:
$ ./pcm2amrnb ./audio/test_8000_16_1.pcm out.amr # 不管输入的PCM是单声道还是双声道,这里输出的amr都是单声道的
$ ./amrnb2pcm ./audio/test.amr out_8000_16_1.pcm # 解码出来的PCM都是8KHz单声道
编码参数要求
解码输出参数
c. 参考文章
-
https://blog.youkuaiyun.com/hanzhen7541/article/details/100932834
-
“Amr supports only 8000Hz sample rate and 4.75k, 5.15k, …”: https://stackoverflow.com/questions/2559746/getting-error-while-converting-wav-to-amr-using-ffmpeg#
d. 附录
$ tree
.
├── audio
│ ├── test_8000_16_1.pcm
│ ├── test_8000_16_2.pcm
│ └── test.amr
├── docs
│ ├── AMR文件格式分析_dinggo的专栏-优快云博客_amr格式.mhtml
│ ├── AMR编码文件解析_hanzhen7541的博客-优快云博客.mhtml
│ └── audio - getting error while converting wav to amr using ffmpeg - Stack Overflow.mhtml
├── include
│ ├── interf_dec.h
│ └── interf_enc.h
├── libs
│ └── libopencore-amrnb.a
├── main_amrnb2pcm.c
├── main_pcm2amrnb.c
├── Makefile
└── README.md
2、主要代码片段
main_pcm2amrnb.c
#include <stdio.h>
#include <stdlib.h>
#include "interf_enc.h"
/* PCM参数 */
#define PCM_SAMPLERATE (8000) /* 只能编码 8 khz */
#define PCM_SAMPLEBITS (16) /* 只支持16位 */
#define PCM_CHANNELS (1) /* 不管PCM输入是单声道还是双声道,这里输出的amr都是单声道的 */
/* amr一帧数据是20ms,一秒50帧。8000,16,1 ==> 320 Bytes */
#define PCM_ONE_FRAME_SIZE (PCM_SAMPLERATE/50 * PCM_SAMPLEBITS/8 * PCM_CHANNELS)
/* AMR参数 */
#define AMR_ENCODE_MODE MR122
#define AMR_ONE_FRAME_SIZE (32) /* MR122格式是32字节一帧 */
/* 是否使能背景噪声编码模式 */
#define DTX_DECODE_ENABLE 1
#define DTX_DECODE_DISABLE 0
int main(int argc, char *argv[])
{
int dtx = DTX_DECODE_ENABLE;
void *vpAmr = NULL;
FILE *fpAmr = NULL;
FILE *fpPcm = NULL;
/* 检查参数 */
if(argc != 3)
{
printf(