【问题标题】:In a VOIP application, when / where are codecs decided?在 VOIP 应用程序中,何时/何地决定编解码器?
【发布时间】:2013-08-13 12:46:07
【问题描述】:

我不熟悉为移动设备创建 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/

其他信息

好的,我发现了一些更有趣的东西。我将这段代码写到我的安卓应用程序中:

//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,它仍然允许呢?

【问题讨论】:

    标签: sip voip asterisk


    【解决方案1】:

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

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

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

     asterisk -rx "sip show settings"
    

    同行的编解码器可以被看到

    asterisk -rx "sip show peer peer_name_here"
    

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

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

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

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

    asterisk -r
    sip set debug on
    

    【讨论】:

    • 在我的情况下 sip show peer Xsip show settings 总是有 same 编解码器列表。有什么想法有什么问题吗?
    • 我已经告诉你了。检查 sip 调试。你会知道是哪一方发起了挂断。
    • 在星号 g711.a 中称为 alaw g711.u 称为 ulaw
    猜你喜欢
    • 2016-10-11
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多