概述

在企业级VOIP通信中,语音质量是重要的关注点,而语音质量的好坏和媒体编解码有重要的关系。

freeswitch作为一款免费开源的软交换平台,支持多种不同的编解码格式,具体详情本文不多描述。

而不同的终端也会支持多种不同的编解码格式,在呼叫创建过程中就需要编解码的协商。

编解码的协商过程是很容易让人困惑的,即使是对SIP和SDP很熟悉的人也一样。

那么,freeswitch在软交换的过程中,是如何控制A/B路之间媒体的协商过程?如何配置出我们想要的协商方案?不同方案都有什么优缺点?

本文主要描述freeswitch在媒体协商过程中的三种常见方案。

文章中有较多的配置和日志打印信息可以略过不看,仅对fs的处理流程理解有帮助。

环境

centos:CentOS  release 6.0 (Final)或以上版本

freeswitch:v1.6.19

GCC:4.4.7

三种方案

freeswitch支持俩种基本的媒体协商模式,早协商和晚协商。

另外,在某些特别的场景要求下,我们也可以通过配置实现混合协商的模式,混合协商主要用于需要转码的场景。

在后面的场景描述中,我们使用用户A,B和freeswitch作为注册服务器,主要参数如下:

用户A,账号1010,支持媒体PCMA/G729。

用户B,账号1011,支持媒体PCMA/PCMU。

freeswitch注册服务器,支持媒体“G729/PCMA/OPUS@8000h/PCMU”。

freeswitch服务器上账号1010的配置如下,其中“user_context=codec_trans”的配置表示1010账号发起呼叫进入的dialplan拨号计划。

conf/directory/default/1010.xml

<include>

<user id="1010">

<params>

<param name="password" value="$${default_password}"/>

</params>

<variables>

<variable name="accountcode" value="1010"/>

<variable name="user_context" value="codec_trans"/>

</variables>

</user>

</include>

早协商

早协商是fs的默认配置

freeswitch配置如下

conf/sip_profile/internal.xml

<param name="inbound-late-negotiation" value="false"/>

<param name="inbound-zrtp-passthru" value="false"/>

conf/dialplan/test.xml

<include>

<context name="codec_trans">

<extension name="out_in">

<condition field="destination_number" expression="^(.*)$">

<action application="bridge" data="{}user/$1"/>

</condition>

</extension>

</context>

</include>

媒体过程如下

A with PCMA/G729 --------> FS (allowing G729/PCMA/OPUS@8000h/PCMU) with PCMA --------> B

B收到的SDP中只有PCMA一种编码格式,如果B支持PCMA则回复180/183,如果不支持则直接回复488。

freeswitch的主要日志流程如下

###fs收到的A路媒体信息,包含PCMA/G729###

2022-01-04 11:20:42.366204 [DEBUG] sofia.c:7094 Remote SDP:

m=audio 29736 RTP/AVP 8 18 101

###fs对A路媒体匹配,并设置协商结果###

2022-01-04 11:20:42.366204 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[G729:18:8000:20:8000:1]

2022-01-04 11:20:42.366204 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[PCMA:8:8000:20:64000:1]

2022-01-04 11:20:42.366204 [DEBUG] switch_core_media.c:4504 Audio Codec Compare [PCMA:8:8000:20:64000:1] ++++ is saved as a match

2022-01-04 11:20:42.366204 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[opus:116:48000:20:0:1]

2022-01-04 11:20:42.366204 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[PCMU:0:8000:20:64000:1]

2022-01-04 11:20:42.366204 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [G729:18:8000:20:8000:1]/[G729:18:8000:20:8000:1]

2022-01-04 11:20:42.366204 [DEBUG] switch_core_media.c:4504 Audio Codec Compare [G729:18:8000:20:8000:1] ++++ is saved as a match

2022-01-04 11:20:42.366204 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [G729:18:8000:20:8000:1]/[PCMA:8:8000:20:64000:1]

2022-01-04 11:20:42.366204 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [G729:18:8000:20:8000:1]/[opus:116:48000:20:0:1]

2022-01-04 11:20:42.366204 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [G729:18:8000:20:8000:1]/[PCMU:0:8000:20:64000:1]

2022-01-04 11:20:42.366204 [DEBUG] switch_core_media.c:3061 Set Codec sofia/internal/1010@192.168.0.202 PCMA/8000 20 ms 160 samples 64000 bits 1 channels

2022-01-04 11:20:42.366204 [DEBUG] switch_core_codec.c:111 sofia/internal/1010@192.168.0.202 Original read codec set to PCMA:8

###fs发送给B路的媒体信息,只包含了PCMA###

Local SDP:

m=audio 28428 RTP/AVP 8 101

###fs收到B路响应的媒体信息###

2022-01-04 11:20:44.726206 [DEBUG] sofia.c:7094 Remote SDP:

m=audio 28356 RTP/AVP 8 101

###fs对B路响应媒体匹配,并设置协商结果###

2022-01-04 11:20:44.726206 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[PCMA:8:8000:20:64000:1]

2022-01-04 11:20:44.726206 [DEBUG] switch_core_media.c:4504 Audio Codec Compare [PCMA:8:8000:20:64000:1] ++++ is saved as a match

2022-01-04 11:20:44.726206 [DEBUG] switch_core_media.c:3061 Set Codec sofia/internal/1011@10.9.0.70:6202 PCMA/8000 20 ms 160 samples 64000 bits 1 channels

2022-01-04 11:20:44.726206 [DEBUG] switch_core_codec.c:111 sofia/internal/1011@10.9.0.70:6202 Original read codec set to PCMA:8

###fs发送给A路的响应媒体,只包含了PCMA###

2022-01-04 11:20:44.726206 [DEBUG] mod_sofia.c:852 Local SDP sofia/internal/1010@192.168.0.202:

m=audio 28208 RTP/AVP 8 101

###开始正常通话###

晚协商

晚协商的配置如下

conf/sip_profile/internal.xml

<param name="inbound-late-negotiation" value="true"/>

<param name="inbound-zrtp-passthru" value="true"/>

conf/dialplan/test.xml

<include>

<context name="codec_trans">

<extension name="out_in">

<condition field="destination_number" expression="^(.*)$">

<action application="bridge" data="{}user/$1"/>

</condition>

</extension>

</context>

</include>

媒体过程如下

A with PCMA/G729 --------> FS (allowing G729/PCMA/OPUS@8000h/PCMU) with PCMA/G729 --------> B

fs收到A的媒体后不做匹配处理,直接复制媒体并发送给B,由B路协商并返回支持的编解码。

freeswitch的主要日志流程如下

###fs收到的A路媒体信息,包含PCMA/G729###

2022-01-04 12:11:59.767089 [DEBUG] sofia.c:7094 Remote SDP:

m=audio 53718 RTP/AVP 8 18 101

###fs发送给B路的媒体信息,包含PCMA/G729###

Local SDP:

m=audio 22148 RTP/AVP 8 18 101

###fs收到B路响应的媒体信息###

2022-01-04 12:12:01.406937 [DEBUG] sofia.c:7094 Remote SDP:

m=audio 14120 RTP/AVP 8 101

###fs对B路响应媒体匹配,并设置协商结果###

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[PCMA:8:8000:20:64000:1]

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:4504 Audio Codec Compare [PCMA:8:8000:20:64000:1] ++++ is saved as a match

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[G729:18:8000:20:8000:1]

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:3061 Set Codec sofia/internal/1011@10.9.0.70:6202 PCMA/8000 20 ms 160 samples 64000 bits 1 channels

2022-01-04 12:12:01.429318 [DEBUG] switch_core_codec.c:111 sofia/internal/1011@10.9.0.70:6202 Original read codec set to PCMA:8

###fs对A路媒体匹配,并设置协商结果###

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[G729:18:8000:20:8000:1]

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[PCMA:8:8000:20:64000:1]

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:4504 Audio Codec Compare [PCMA:8:8000:20:64000:1] ++++ is saved as a match

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[opus:116:48000:20:0:1]

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[PCMU:0:8000:20:64000:1]

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [G729:18:8000:20:8000:1]/[G729:18:8000:20:8000:1]

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:4504 Audio Codec Compare [G729:18:8000:20:8000:1] ++++ is saved as a match

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [G729:18:8000:20:8000:1]/[PCMA:8:8000:20:64000:1]

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [G729:18:8000:20:8000:1]/[opus:116:48000:20:0:1]

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [G729:18:8000:20:8000:1]/[PCMU:0:8000:20:64000:1]

2022-01-04 12:12:01.429318 [DEBUG] switch_core_media.c:3061 Set Codec sofia/internal/1010@192.168.0.202 PCMA/8000 20 ms 160 samples 64000 bits 1 channels

2022-01-04 12:12:01.429318 [DEBUG] switch_core_codec.c:111 sofia/internal/1010@192.168.0.202 Original read codec set to PCMA:8

###fs发送给A路的响应媒体,只包含了PCMA###

2022-01-04 12:12:01.429318 [DEBUG] mod_sofia.c:852 Local SDP sofia/internal/1010@192.168.0.202:

m=audio 31642 RTP/AVP 8 101

###开始正常通话###

混合媒体

混合协商是在早协商的基础上增加了一个混合媒体的通道变量配置项(media_mix_inbound_outbound_codecs),主要场景应用于需要转码的情况。

混合协商的配置如下

conf/sip_profile/internal.xml

<param name="inbound-late-negotiation" value="false"/>

<param name="inbound-zrtp-passthru" value="false"/>

conf/dialplan/test.xml

<include>

<context name="codec_trans">

<extension name="out_in">

<condition field="destination_number" expression="^(.*)$">

<action application="bridge" data="{media_mix_inbound_outbound_codecs=true}user/$1"/>

</condition>

</extension>

</context>

</include>

媒体过程如下

A with PCMA/G729 --------> FS (allowing G729/PCMA/OPUS@8000h/PCMU) with PCMA/G729/OPUS@8000h/PCMU --------> B

B收到的SDP中有多种编码格式PCMA/G729/OPUS@8000h/PCMU,并且媒体优先级顺序根据A路媒体信息有调整,如果B支持则回复180/183,如果不支持则直接回复488。

freeswitch的主要日志流程如下

###fs收到的A路媒体信息,包含PCMA/G729###

2022-01-04 12:29:16.615987 [DEBUG] sofia.c:7094 Remote SDP:

m=audio 59602 RTP/AVP 8 18 101

###fs对A路媒体匹配,并设置协商结果###

2022-01-04 12:29:16.615987 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[G729:18:8000:20:8000:1]

2022-01-04 12:29:16.615987 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[PCMA:8:8000:20:64000:1]

2022-01-04 12:29:16.615987 [DEBUG] switch_core_media.c:4504 Audio Codec Compare [PCMA:8:8000:20:64000:1] ++++ is saved as a match

2022-01-04 12:29:16.615987 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[opus:116:48000:20:0:1]

2022-01-04 12:29:16.615987 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[PCMU:0:8000:20:64000:1]

2022-01-04 12:29:16.615987 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [G729:18:8000:20:8000:1]/[G729:18:8000:20:8000:1]

2022-01-04 12:29:16.615987 [DEBUG] switch_core_media.c:4504 Audio Codec Compare [G729:18:8000:20:8000:1] ++++ is saved as a match

2022-01-04 12:29:16.615987 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [G729:18:8000:20:8000:1]/[PCMA:8:8000:20:64000:1]

2022-01-04 12:29:16.615987 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [G729:18:8000:20:8000:1]/[opus:116:48000:20:0:1]

2022-01-04 12:29:16.615987 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [G729:18:8000:20:8000:1]/[PCMU:0:8000:20:64000:1]

2022-01-04 12:29:16.615987 [DEBUG] switch_core_media.c:3061 Set Codec sofia/internal/1010@192.168.0.202 PCMA/8000 20 ms 160 samples 64000 bits 1 channels

2022-01-04 12:29:16.615987 [DEBUG] switch_core_codec.c:111 sofia/internal/1010@192.168.0.202 Original read codec set to PCMA:8

###fs发送给B路的媒体信息,包含了PCMA/G729/OPUS@8000h/PCMU###

Local SDP:

m=audio 26098 RTP/AVP 8 18 102 0 101 103

###fs收到B路响应的媒体信息,其中包含了PCMA/PCMU###

2022-01-04 12:29:18.675991 [DEBUG] sofia.c:7094 Remote SDP:

m=audio 50386 RTP/AVP 8 0 101

###fs对B路响应媒体匹配,并设置协商结果###

2022-01-04 12:29:18.675991 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[PCMA:8:8000:20:64000:1]

2022-01-04 12:29:18.675991 [DEBUG] switch_core_media.c:4504 Audio Codec Compare [PCMA:8:8000:20:64000:1] ++++ is saved as a match

2022-01-04 12:29:18.675991 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[G729:18:8000:20:8000:1]

2022-01-04 12:29:18.675991 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[opus:116:48000:20:0:1]

2022-01-04 12:29:18.675991 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMA:8:8000:20:64000:1]/[PCMU:0:8000:20:64000:1]

2022-01-04 12:29:18.675991 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMU:0:8000:20:64000:1]/[PCMA:8:8000:20:64000:1]

2022-01-04 12:29:18.675991 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMU:0:8000:20:64000:1]/[G729:18:8000:20:8000:1]

2022-01-04 12:29:18.675991 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMU:0:8000:20:64000:1]/[opus:116:48000:20:0:1]

2022-01-04 12:29:18.675991 [DEBUG] switch_core_media.c:4449 Audio Codec Compare [PCMU:0:8000:20:64000:1]/[PCMU:0:8000:20:64000:1]

2022-01-04 12:29:18.675991 [DEBUG] switch_core_media.c:4504 Audio Codec Compare [PCMU:0:8000:20:64000:1] ++++ is saved as a match

2022-01-04 12:29:18.675991 [DEBUG] switch_core_media.c:3061 Set Codec sofia/internal/1011@10.9.0.70:45280 PCMA/8000 20 ms 160 samples 64000 bits 1 channels

2022-01-04 12:29:18.675991 [DEBUG] switch_core_codec.c:111 sofia/internal/1011@10.9.0.70:45280 Original read codec set to PCMA:8

###fs发送给A路的响应媒体,只包含了PCMA###

2022-01-04 12:29:18.695978 [DEBUG] mod_sofia.c:852 Local SDP sofia/internal/1010@192.168.0.202:

m=audio 19556 RTP/AVP 8 101

###开始正常通话###

总结

freeswitch中不同的协商模式适用于不同的场景,具体应用中要根据实际情况实际分析。

不同的协商模式的主要区别在于协商的时机和结果的选择。

早协商,在A路协商并确定最终编解码格式。

晚协商,在B路协商并确定最终编解码格式。

混合协商,在A路和B路分别协商,在需要的情况下可以转码。

有一点要注意的是,在生产环境中,我们尽量不使用转码的配置方案,因为转码会大量的消耗机器资源,影响机器性能。

根据我们以往的测试结果,服务器转码和不转码的并发数大概在1:5,有转码的服务器主要瓶颈在CPU上。

空空如常

求真得真

freeswitch媒体协商的三种配置方案的更多相关文章

  1. freeswitch媒体协商的优先级方案

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 不同的媒体格式各有优缺点,实际环境中的应用要根据线路和客户的实际需求确定. 本文中介绍一种较为通用的媒体配置方案,可以适配大部分场景 ...

  2. 菜鸟学习Spring——SpringIoC容器基于三种配置的对比

    一.概述 对于实现Bean信息定义的目标,它提供了基于XML.基于注解及基于java类这三种选项.下面总结一下三种配置方式的差异. 二.Bean不同配置方式比较. 三.Bean不同配置方式的适用场合. ...

  3. 第九节: 利用RemoteScheduler实现Sheduler的远程控制 第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案 第六节: 六类Calander处理六种不同的时间场景 第五节: Quartz.Net五大构件之Trigger的四大触发类 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联

    第九节: 利用RemoteScheduler实现Sheduler的远程控制   一. RemoteScheduler远程控制 1. 背景: 在A服务器上部署了一个Scheduler,我们想在B服务器上 ...

  4. 暑假打工 2 个 月,让我明白了 Keepalived 高可用的三种路由方案

    暑假打工 2 个 月,让我明白了 Keepalived 高可用的三种路由方案 这是悟空的第 158 篇原创文章 原文链接:首发悟空聊架构 官网:www.passjava.cn 你好,我是悟空. 前言 ...

  5. Linux操作系统下三种配置环境变量的方法

    现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以配置java环境变量为例介绍三种配置环境变量的方法. 1.修改/etc/profile文件 如果你的计算机仅仅作 ...

  6. struts2拦截器interceptor的三种配置方法

    1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...

  7. Linux操作系统下三种配置环境变量的方法——转载

    来源:赛迪网 作者:millio       现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以配置java环境变量为例介绍三种配置环境变量的方法. 1.修改/e ...

  8. tomcat下jndi的三种配置方式

    jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...

  9. IIS下PHP的三种配置方式比较

    在Windows IIS 6.0下配置PHP,通常有CGI.ISAPI和FastCGI三种配置方式,这三种模式都可以在IIS 6.0下成功运行,下面我就讲一下这三种方式配置的区别和性能上的差异. 1. ...

  10. 【转】tomcat下jndi的三种配置方式

    jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...

随机推荐

  1. 【最佳实践】京东小程序-LBS业务场景的性能提升

    一.前言 1.1 京东LBS门详业务介绍 京东LBS门详目前已经支持了仓网.药急送.天选.小时达POP多种业务,并且具备了多端的能力,一套代码可以在京东app.健康app.微信小程序中运行,一定程度上 ...

  2. lottie 动画在 vue 中的使用

    前言 最近我所负责的项目中,我采用了动画效果,并开始使用 gif 来实现.然而,在实践过程中,我发现 gif 格式的动画在 git 中出现了明显的锯齿感,这让我非常困扰.为了追求更完美的表现效果,我最 ...

  3. Python——第二章:替换和切割

    strip() 用法: .strip() 是字符串方法之一,在 Python 中用于移除字符串开头和结尾的空白字符(包括空格.制表符 \t.换行符\n等).这个方法返回一个新的字符串,原始字符串本身不 ...

  4. intel 虚拟化 VT-d VT-x VT-c 的区别

    intel 虚拟化 VT-d VT-x VT-c 有什么区别,各是什么意思,有什么作用 简单描述理解 VT-d VT-x VT-c VT-d 英文全程为 Virtualization Technolo ...

  5. 良心国产工具,比Xshell好用还免费!

    使用或维护Linux系统的都知道,我们日常对服务器的操作,一般都会借助SSH工具远程登录到服务器之后进行操作.常用的SSH工具有不少,比如:Xshell.Putty.SSH Secure Shell ...

  6. P9344 去年天气旧亭台 代码

    不带滚动数组代码: #include <iostream> #include <cstdio> #include <cstring> #define int lon ...

  7. .NET技术分享日活动-202110

    2021年10月15日下午,个人组织举办了山东地区的第三次.NET技术分享日活动.围绕.NET.低代码Low Code.云原生 Cloud Native.大数据.算法等方向进行创新技术的实践分享. 本 ...

  8. 一文带你搞懂从动态代理实现到Spring AOP

    摘要:本文主要讲了Spring Aop动态代理实现的两种方式. 1. Spring AOP Spring是一个轻型容器,Spring整个系列的最最核心的概念当属IoC.AOP.可见AOP是Spring ...

  9. 开发老人笔记:Git 常用命令清单

    摘要:git是目前世界上最先进的分布式版本控制系统. 多人协作 master:此分支用来发布稳定的代码,合并一般是由管理员合并 dev:此分支用于团队开发,团队成员向此分支提交代码 bug:此分支用于 ...

  10. JPEG/Exif/TIFF格式解读(4):win10照片旋转win7不识别

    xif元数据根据不同的内容分布在五个不同的IFD中. IFD0中的数据是由TIFF定义的基本图像数据,其中有些与照片无关,所以Exif只实现其中一小部分.这部份数据在Photoshop中称为TIFF元 ...