gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:54:41 24 4
gpt4 key购买 nike

我刚开始为移动设备创建 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”。我进行了谷歌搜索,发现它与 G.711 相关联。

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

最佳答案

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

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

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

 asterisk -rx "sip show settings"

Peers 编解码器可以被看到

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com