在VOIP应用程序中,什么时候/哪里是编解码器?

时间:2013-08-13 12:46:07

标签: sip voip asterisk

我刚开始为移动设备创建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和我的sip.conf的var_dump中出现的唯一编解码器吗?

如果有帮助,这是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,它仍然允许它?

1 个答案:

答案 0 :(得分:5)

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

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

2)检查[general]部分中对等OR中的编解码器。 Peer具有优先权,但是如果你没有disallow = all,那么来自[general]部分的对等部分编解码器也可以使用。 [general]节编解码器可以通过以下方式看到:

 asterisk -rx "sip show settings"

可以通过

查看对等编解码器
asterisk -rx "sip show peer peer_name_here"

3)选择与两个部分匹配的第一个编解码器。按照星号配置

中的说明进行排序

在传出时它做类似的选择,如果不匹配则进行转码。不幸的是星号目前没有尝试选择两个对等的编解码器,所以高度推荐使用相同的编解码器顺序甚至单个编解码器来避免转码(降低质量+高CPU使用率)

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

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

asterisk -r
sip set debug on