天天看点

3gpp amr 源码 windows 下编译及使用

从 3gpp.org 下载的 amrnb 源码在网上的资料很少,找了一圈没有找到比较系统的介绍。从诸多资料里看到 3gpp 里 amr 的根源,google android, ffmpeg 之类的好像也从 3gpp 里出来。amr 的根源暂且不究。现在 windows 下编译 3gpp 源码包里的 coder & decoder, 学习之用。

事实上 3gpp 源码没有依赖什么库,编译很简单。只是资料较少,刚上手时偶尔会头大。

1. 从 http://www.3gpp.org/  下载源码包。26073-b00.zip 和 ts_126073v110000p0.zip 两个里面都有 c-code 源码。不同在于其他一些 .doc 之类的文档。大体看了一下,里面的文档都基本没用,可略过。

2. 3gpp 源码号称是标准 ansi c code, 市面上大多数编译器应该都能编译过。事实应该也是,我用 msvc 编译时很顺利,没有出现一堆 warning 之类的。nice code. 用 msvc 之前在 debian7 下试图直接 make, 提示 can't determine architecture. 应该是需要加 -D 之类的定义,这个可以后期再尝试一下。typedefs.h 里有细节。

3. 3gpp 源码里有 codec 还有 coder/decoder 两个 bin,  codec 还不知道如何单独编译,先编译 coder & decoder

----------------------------------------

1. 新建 win32 console 程序 (ms vs2k5)

2. 根据 src 里的 makefile, 把 coder 需要的 coder.c 和一堆 .h 复制到目录下,有些 .h 文件有同名的 .c 文件,一并复制

3. 把 .c 文件加到工程,编译,会有一堆提示,少文件,挨个把文件都复制到目录下,.c 文件添加到工程 (注意这里有 .tab 文件,也要复制,不过不需要加到工程)

4. 不断重复步骤3就可以得到 coder & decoder 两个 .exe 了

----------------------------------------

Issue:

1. 要用 __MSDOS__ 定义

2. coder 里用 VAD1 定义,decoder 不用。coder 里的 vad2.c 会有函数未定义,编译不通过。这里直接把 vad2.c 从工程去掉就可以。vad 默认是使用 vad1, vad2 不用也可以。

3. error LNK2001: unresolved external symbol _extract_h 这个在 basic_op.h 里,对应的源文件 basicop2.c, 加进工程即可。

----------------------------------------

得到 coder.exe & decoder.exe 后,测试一下。用 win32 waveIn/waveOut 系列 API 写了个程序,把 8khz, 16bits, 单声道的 pcm 裸数据直接写文件。先确定 record & playback 都ok, 再用 coder decoder 分别做编码和解码。测试结果是可用的。不过有一点,coder 生成的结果文件大小不是纯 amr 数据。我用 MR475 作 coder 的 mode 参数,得到的文件比 pcm 源文件还大。跟进源码里看了下,是因为其在写文件时,是每frame写了 250*sizeof(WORD)大小,也就是一帧500字节。所以文件大小是对的,只是我还不理解为什么是这样个写法。正常的 475 格式应该是每frame 13 byte. 不知道其所谓的 bitstream file 是个什么概念。对 amr 理论不熟,没办法了。

另外感觉 coder encode 速度也不够快,应该是我的测试方法无说服力。理论上实时语音codec应该是要非常迅速的。

还不知道 .amr 文件格式的解析。这个网上资料多点,多翻翻就ok.

之前用过 speex 感觉蛮好的,不过好像最后的压缩比没 amr 高,另外据称 amr 在手机上可以硬编硬解,所以速度上可能还有优势。不过 amr 的音质真的是。。。

以前用过 g729, 看了一下,码率在 8kbps, 比 amr 最低的 4.75 还是高点。而且 g729 好像没有正经的开源实现。以前用过一个 .lib, 虽然是免费,不过感觉总是差了点。

有空再继续,主要是 .amr 文件的生成及回放,amr 应用于实时语音。

音视频的资料实在太多,要老命。