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

Joh*_*ohn 2 voip asterisk sip

我是新手为移动设备创建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
Run Code Online (Sandbox Code Playgroud)

这是很多编解码器......所以我们如何知道正在使用哪一个?

至于我的星号服务器,我的sip.conf为每个用户提供以下行:

allow=ulaw
allow=gsm
Run Code Online (Sandbox Code Playgroud)

那么这是否意味着我正在使用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
Run Code Online (Sandbox Code Playgroud)

我注意到变量mime当前保持值"PCMU".我做了谷歌搜索,我发现它与G.711相关联.

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

arh*_*ops 5

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

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

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

 asterisk -rx "sip show settings"
Run Code Online (Sandbox Code Playgroud)

可以看到对等编解码器

asterisk -rx "sip show peer peer_name_here"
Run Code Online (Sandbox Code Playgroud)

3)选择与两个部分匹配的第一个编解码器.按照星号 配置中的描述进行排序.

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

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

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

asterisk -r
sip set debug on
Run Code Online (Sandbox Code Playgroud)