2

我是为移动设备创建 voip 应用程序的新手。我目前有一个星号服务器设置,还有一个 iphone voip 应用程序和一个 android voip 应用程序。对于 iphone 和 android,我使用 linphone 核心库作为我的 sip 库。

现在,我能够成功拨打电话。有时我会遇到通话质量问题,例如音频中的“噼啪声”,或者部分人的句子被丢弃。因此,我正在努力提高性能。

这是我第一次研究编解码器,所以我试图确定哪些编解码器实际在使用。所以我的问题是:

何时实际使用编解码器?电话是否使用编解码器来压缩要上传的音频并解压缩传入的音频?或者星号服务器上发生了什么?或两者?

我一直无法弄清楚这个问题的答案。当我运行 linphone 命令 getAudioCodecs() 时,它会为我提供可用编解码器的列表,但实际上并不是特定呼叫中使用的编解码器。例如,这里是函数 getAudioCodecs() 在调用过程中的 var_dump:

08-13 08:39:49.787: I/System.out(16358): codec:SILK 16000
08-13 08:39:49.787: I/System.out(16358): codec:speex 16000
08-13 08:39:49.787: I/System.out(16358): codec:speex 8000
08-13 08:39:49.787: I/System.out(16358): codec:PCMU 8000
08-13 08:39:49.787: I/System.out(16358): codec:PCMA 8000
08-13 08:39:49.797: I/System.out(16358): codec:SILK 24000
08-13 08:39:49.797: I/System.out(16358): codec:SILK 12000
08-13 08:39:49.797: I/System.out(16358): codec:SILK 8000
08-13 08:39:49.797: I/System.out(16358): codec:speex 32000
08-13 08:39:49.797: I/System.out(16358): codec:AMR 8000
08-13 08:39:49.797: I/System.out(16358): codec:iLBC 8000
08-13 08:39:49.797: I/System.out(16358): codec:L16 44100
08-13 08:39:49.797: I/System.out(16358): codec:L16 44100
08-13 08:39:49.807: I/System.out(16358): codec:G722 8000
08-13 08:39:49.817: I/System.out(16358): codec:GSM 8000

那是很多编解码器......那么我们怎么知道正在使用哪个编解码器?

至于我的星号服务器,我的 sip.conf 对每个用户都有以下几行:

allow=ulaw
allow=gsm

这是否意味着我正在使用 GSM?因为 GSM 是我的 getAudioCodecs 的 var_dump 和我的 sip.conf 中出现的唯一编解码器?

如果有帮助,这里是 linphone sip 库的文档: http ://www.linphone.org/docs/liblinphone-javadoc/

附加信息

好的,我发现了一些更有趣的东西。我将此代码写入我的 android 应用程序:

//mLC is the currently active LinphoneCore object when receiving a call
LinphoneCallParams lcp = mLc.getCurrentCall().getCurrentParamsCopy();
PayloadType pt = lcp.getUsedAudioCodec();
String mime = pt.getMime();  // the mime value is PCMU

我注意到变量 mime 当前持有值“PCMU”。我做了一个谷歌搜索,我发现它与 G.711 相关联。

那么我可以假设在 android 应用程序上,它是 G.711 编解码器吗?如果是这样,那为什么即使我在我的 sip.conf 中没有提到 G711,它仍然允许呢?

4

1 回答 1

5

星号上的编解码器将按以下顺序选择

1) 检查您的设备在 INVITE 中允许使用的编解码器

2)检查您在对等或 [general] 部分中有哪些编解码器。Peer 具有优先级,但如果您在 peer 部分中没有 disallow=all 则来自 [general] 部分的编解码器也可以使用。[general] 部分编解码器可以通过以下方式查看:

 asterisk -rx "sip show settings"

对等编解码器可以通过

asterisk -rx "sip show peer peer_name_here"

3) 选择匹配两个部分的第一个编解码器。按照星号的 配置中描述的顺序。

在传出它做类似的选择,如果不匹配做转码。不幸的是,星号目前没有尝试选择双方都支持的编解码器,因此强烈建议使用相同顺序的编解码器甚至单个编解码器以避免转码(降低质量+hi cpu 使用率)

G711a 和 alaw 是相同的编解码器(只是其他名称) G711u 和 ulaw 是相同的编解码器。从alaw转码到ulaw是无损的,非常简单,所以没有质量损失。

目前星号不支持非对称编解码器,因此两种方式都是相同的编解码器。要获得更多信息,请使用

asterisk -r
sip set debug on
于 2013-08-14T14:19:17.137 回答