sip - 在 VOIP 应用程序中,编解码器何时/何地决定?

标签 sip voip asterisk

我刚开始为移动设备创建 VoIP 应用程序。我目前设置了一个 asterisk 服务器以及一个 iphone voip 应用程序和一个 android voip 应用程序。对于 iphone 和 android,我使用 linphone 核心库作为我的 sip 库。

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

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

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

我一直没能找到这个问题的答案。当我运行 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

有很多编解码器...那么我们如何知道正在使用哪一个?

对于我的 asterisk 服务器,我的 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”。我进行了 google 搜索,发现它与 G.711 相关。

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

最佳答案

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

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

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

 asterisk -rx "sip show settings"

可以通过以下方式查看对等编解码器

asterisk -rx "sip show peer peer_name_here"

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

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

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

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

asterisk -r
sip set debug on

关于sip - 在 VOIP 应用程序中,编解码器何时/何地决定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18209501/

相关文章:

java - Asterisk:- 如何使用 java 在 Asterisk 框中实现自动拨号

ios - 我们如何使用 pjsip 和 callkit 处理多个调用

sdk - 需要关于 Ozeki(IP 语音)VoIP SIP SDK 的反馈

android - 在 Android 上的 PJSIP 2.5.1 上启用和配置 OPUS 编解码器

python - 带有*的Python函数作为参数:def blah(x,*,y)

asterisk - 将数据保存到自定义 cdr 字段中

javascript - 如果我有SIP帐号,如何通过PC上的浏览器调用电话?

android - 缺少 android.net.sip

用于 Cordova 的 Java SIP 插件或用于音频和视频流的 Phonegap

php - sendfax php 不工作,给出代码 255