【发布时间】: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,它仍然允许呢?
【问题讨论】: