我是为移动设备创建 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/
附加信息
好的,我发现了一些更有趣的东西。我将此代码写入我的 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,它仍然允许呢?