第十三章 会议与WebRTC视频会议

        会议是你希望向用户和客户提供的高级功服务一。在我们处于成本控制和时间限制的夹缝之中时,拥有虚拟会议的能力是一种实打实的好处。

        更重要的是,如果你能够管理会议,有序地为每位演讲者配麦,对每个与会者静音/取消静音,等等。

        当你能够为与会者混合视频流时,你就能够提供更多的特性:屏幕共享、播放视频、录制,同时提供不同人组成的“舞台”画面…这不仅比在一个实际房间里走来走去参加会议更经济,更便捷,而且会更有成效。

        我们还开发了一个WebRTC客户端,充分利用我们的现代VERTO协议,为参与者和主持人提供一个美丽、高效、沉浸式和引人入胜的会议体验!

        FreeSWITCH给出了所有构建块,由于WebRTC的支持,你的会议参与者、主持人和演示者只需要在他们的计算机、平板电脑或智能手机上安装一款标准浏览器就够了。

        这一章,我们将讨论以下主题:

  • 会议概念,音频和视频
  • FreeSWITCH的会议支持
  • 在FreeSWITCH中设置音频会议
  • 音频会议操作
  • 在FreeSWITCH中设置视频会议
  • 视频会议操作
  • 视频会议中的Verto通信
  • 视频会议的其它技巧

会议概念

        会议指的是超过两方参与者的一路话务,它一直是电信领域中最受欢迎的服务之一。

        允许两个以上的参与者同时交谈的技术(例如,不在一键通服务中)与两个参与者的“正常”通话的技术大不相同。在“正常”的通话中,你只关心主叫与被叫间的媒体流交换。事实上,你可以让媒体流(以RTP形式)直接在主叫与被叫间双向流动,而不必经过FreeSWITCH或其它任何中间电信服务器。

        另一方面,会议需要一台服务器。会议服务中的最基本功能是混合,比如说把不同参与者所发送的媒体流合并。因此,每个参与者把他们自身的媒体流发给服务器,而所有参与者收到的媒体流是服务器收到的所有媒体流的“和”。参与者之间不直接通信,而是通过会议服务器作为中心枢纽的“星型拓扑”连接在一起。

         除了基本的“合并所有传入流并发送结果流”功能外,会议服务还可以提供更高级的特性。它们可以接受命令来变更输入流的合并方式:仅合并其中的一些流(或仅广播一个流);向参与者播放媒体文件;录制会议会话;更改接收或发送的流的特征,请求识别参与者身份的PIN码;把一名或多名与会者视为“主持人”,对其他与会者和会议管理;等等。

        如你所料,FreeSWITCH提供所有这些功能,甚至更多。

 

FreeSWITCH的会议支持

        从构思的第一阶段起,FreeSWITCH的设计结构就擅长混音功能。它的内核可以高效地揉合各种流。

        Freeswitch内核中的媒体处理引擎非常灵活,并提供钩子,以便内核开发人员和贡献者添加功能,而不会危及系统的稳定性和效率。

        显然,媒体处理有两个主要的领域:音频和视频。音频和视频的处理方式完全不同,因为它们的性质完全不同。

音频会议

        音频流由一系列音频样本组成。每个音频样本本质上是一个数字(一个量值),代表声音在时间上的演变。声音可以用我们在高中课本上的正弦波来描述,每个样本都是在某一时刻的振幅值。


        混合(合并,组合)两个或更多的声音样本本质上是对它们的数值求和,然后除以我们混合的流的数量(例如:在每个时间点取平均值)。显然,如果之前样本事先经过压缩、编码,情况就完全不是那么简单了。你需要先对体积标准化。但其最简单的概念形式(未压缩、原始、声音样本)是完全相同的。

视频会议

        视频流完全是另一回事!它们是一个复杂的值序列,描述图像(“屏幕”)随时间的变化。假设有一部分辨率为1920x1080像素的流式电影(或网络摄像机源)。这些像素中的每一个或大部分(全部变化的情况比较罕见)都可以在每个时间点改变值(颜色、亮度等)。因此,每个时间点的样本并不代表屏幕上每个像素的值,而是分析哪个像素发生了变化以及如何变化的复杂计算结果。你不能直接把它们相加,这样没有任何意义。

         而且,当您将视频流组合在一起时,您希望得到的结果一般不是它们的混合叠加(例如“透明”过渡效果)。您希望将屏幕划分为多个区域,并在每个定义的区域中显示不同的视频流(缩放)。或者在每个屏幕区域上显示浮动徽标或标题。这更类似于电视脱口秀节目中导演所使用的“视频混音与特效”处理。

        在当今的电信世界中,视频会议(视频流组合)有多种策略,每种策略都有其自身的理由和用例:

  • Peer-to-Peer (MESH) 这是基于纯设备到设备的通信(无服务器),其中每个参与者向所有其他参与者发送和接收视频流。视频流在设备端(比如说浏览器)进行组合。如果必须影响所有设备的显示,那么每个参与者必须向所有其他参与者广播控制命令。这种策略的明显问题是带宽的开销与参与者方数呈指数级增长:三方会议交换6路视频流;四方会议交换12路视频流;10方会议需要交换90路视频流…这种技术在WebRTC服务中很流行,但不适用于超过四个参与者的会议场景。
  • Selective Forwarding Unit (SFU)它是一种中央服务器,它接收所有参与者的视频流,并决定将哪个流转发给哪个参与者。中央服务器(SFU)不组合流或对其应用效果,它只决定数据包的出入路由。流由终端设备(比如说浏览器)负责组合,一般情况下它们仅是在不同的区域显示不同的流,并没有进一步处理。如果需要在参与者屏幕上组合多个流,那么所有流都需要路由给所有参与者。这对带宽使用和客户端CPU要求非常高,代价可能是非常昂贵的。
  • Multipoint Conferencing Unit (MCU)它是一种中央服务器,它接收所有参与者的视频流,对它们进行混合、转换和应用特效,然后从处理结果中选择一个流发送给所有参与者。对于带宽和客户端的CPU来说,这种策略的要求可能是最低的(每个客户端向MCU发送它们的视频流,并从MCU接收一路视频流)。但是,它对MCU侧的CPU施加了极大的压力,它必解码所有待混合的流,将复杂的计算机图形应用于标题、徽标、合并和缩放,然后对结果重新编码。
  • FreeSWITCH是一个高级的 MCU(混合视频流和应用效果是一项非常繁重的任务),在“只有一个参与者发起视频流并显示在所有参与者屏幕上”的极端场景下,它会变成对CPU需求极低的SFU(换句话说,没有视频合成,没有特效,只是向所有与会者路由一路视频流)。

 

FreeSWITCH中的音频会议设置

        Freeswitch包含一个功能强大的内置引擎,它允许在多用户音频会议系统中对呼叫者之间的音频通道进行混音。            mod_conference允许完全控制音频混合和用户交互功能,比如说tone音监测,管理每个通道的的音频收发路径、音量控制、增益控制等等。只要服务器上的资源(内存、CPU等等)允许,你可以创建会议,没有数量的限制。

        mod_conference的配置文件是/usr/local/freeswitch/autoload_configs/conference.conf.xml。会议的特征和行为都由它的profile决定。你可以在配置文件中设定多个profile,每个profile都有其独特的参数集。创建会议时会分配一个profile(通常是在拨号方案中)。会议的配置文件被划分为几个部分,我们接下来会介绍它们。

 

profiles

        一个会议profile是一组可用于特定会议的设置。与caller-controls(这一节会讨论)结合,会议profiles允许完全定制各个会议的行为。你可以建立几个profiles,并把它们应用到许多会议上;或者为每个打算召开的会议分别建立一个profile;或者干脆简单地使用缺省定义。

        通常的会议profile结构是这样的:

<profiles>
<profile name="default">
<param name="paramName" value="paramValue"/>
</profile>
</profiles>

 

        你可以有任意数量的<profile>标记,每个<profile>标记可以配置任意数量的<param>标记。下面是部分可用参数的解释。如果需要完整的参数列表和扩展说明,请打开我们的在线文档http://freeswitc h.org/confluence,并搜索"mod_conference"。

 

rate

        这个参数定义会议中采用的缺省(最高)采样率。如果不是使用这个采样率,所有接入这个通道的用户都需要把他们的音频转换为这个采样率。为了混音目的,这定义了系统相关的最低采样率----如果两个用户使用高保真话机接入会议,但会议设置的采样率为8000,那么这些用户的音频采样率也将降到较低的速率。

参数语法:<param name="rate" value="8000"/>

可选值有:8000、12000、16000、24000、32000, 和 48000

 

caller-controls

        这个参数定义会议桥所使用的caller-controls profile。

参数语法:<param name="caller-controls" value="default"/>

 

auto-record

        这个参数定义会议是否需要自动录音。如果与会人数达到min-required-recording-participants要求,会议就开始录音。如果设置了这个选项,那么必须包含一条可写的路径,以便存储会议录音。

参数语法:<param name="auto-record" value="filename"/>

缺省值:off。

样本文件名:/usr/local/freeswitch/sounds/conferences/${conference_name}.wav

列出的样本文件名将根据会议桥的名字把会议录制到一个文件中。

 

interval

        这个参数指定混音时每一帧的长度,单位是毫秒。这个设置类似于ptime的工作方式,但不需要与主叫的实际ptime相匹配。它的数值越高,所需要CPU开销越小,但会导致混音后的音质问题,因此,可以通过试验确定你的设定值。通道使用缺省值就足够了。

参数语法:<param name="interval" value="20"/>

缺省值: 20

 

energy-level

         这个参数指定向其他用户发送音频所需要的能量级别(音频强度/音量)。能量水平是一个阈值,它规定了一个门限,用于判断人的说话声音还是前景噪音。这个特性有助于消除混入会议的背景噪音或环境噪音。如果这个选项值设置过高,会导致一句话的开头部分和结束部分被剪掉。零值表示禁用这项检测,所有语音包都会进行混音,即使是背景 噪音也一样。

参数语法: <param name="energy-level" value="20"/>

缺省值:20

设置为0表示完全禁用。

 

member-flags

        此参数允许在各个会议成员上设置特定的成员标志或参数。这些选项包括:参与者是否是主持人;是否以浪费方式混音(即使会议中没有人发言,也照常向个人发送音频);某个特定成员是否是会议的领导者(会议需要等待他进入才能开始,他离开后会议结束),等等。选项可以是多选的,各个选项间以管道符”|”分隔。

 

参数语法: <param name="member-flags" value="waste|endconf"/>

 

        下面我们解释几个member-flags参数的选项。如果需要完整的列表和进一步解释,请访问我们的在线文档http://freeswitch.org/confluence,搜索"mod_conference"。

  • moderator成员拥有一组不同的呼叫控制,可以管理会议:比如对与会者静音或取消静音。
  • deaf默认情况下阻止成员听取会议中的其他成员的意见(可以在会议开始后更改)
  • waste:即使没有对话,也向通道发送音频
  • dist-dtmf向每个通道分发DTMF信号。如果有人在会议中发送DTMF信号音,它通常被FreeSWITCH拦截并处理。这个选项改变DTMF的处理行为,直接把DTMF透传给所有其他成员。
  • endconf如果这个成员退出,那么会议结束

 

conference-flags

        这个参数设置会议级的标志,定义会议的行为。多个选项间以管道符分隔。

参数语法:<param name="conference-flags" value="wait-mod|audio-always"/>

 

下面解释几个常用的conference-flags参数选项。如果需要完整的列表和进一步解释,请访问我们的在线文档http://freeswitch.org/confluence,搜索"mod_conference"。

  • wait-mod强制用户等待主持人进入才能开始会议。当桥接会议时,主持人通过拨号方案传递额外的成员标志来确定。在等待主持人期间,用户会听到保持音。
  • audio-always不检测能量值,成员的发的所有音频包都进入混音(不做静音监测)
  • restart-auto-record如果会议设置了auto-record,并且录音中断,会自动重启录音,录制到一个新文件中。

 

tts-engine

        此参数指定会议桥中使用的TTS引擎。

参数语法: <param name="tts-engine" value="cepstral"/>

 

tts-voice

         这个参数设置会议中TTS引擎输出的声音类型(比如男声、女声、名人的声音)。

参数语法:<param name="tts-voice" value="david"/>

 

pin

        设定会议的PIN码(密码),用户进入会议前必须校验它。

参数语法:<param name="pin" value="12345"/>

 

max-members

        这个参数设定会议允许的最大成员数。如果会议满员后还有其他人接入会议,系统会拒绝,并向他播放max-members-sound。

参数语法:<param name="max-members" value="20"/>

 

caller-id-name

        这个参数设置一个caller ID名字,用于从会议中发出的邀请。

参数语法: <param name="caller-id-name" value="John Doe"/>

 

caller-id-number

        这个参数设置从会议桥中出局呼叫时携带的caller ID号码。

参数语法: <param name="caller-id-number" value="4158867900"/>

 

comfort-noise

        这个参数设定会议中添加的背景白噪声的音量级别。如果会场中没有人发言,太安静的话有些人会误以为掉线了。此时在会场中加入舒适噪音会让人感觉到依然在线。请注意,在较高的音频采样率下,这个噪声可能会变得烦人,因此如果采样率超过8000赫兹,您可能需要调整此设置。

参数语法:<param name="comfort-noise" value="1000"/>

 

announce-count

        此参数将在新成员加入时播报会议中参与人数,但仅当达到此参数所指定的阈值时。它需要有效的TTS引擎。

参数语法: <param name="announce-count" value="5"/>

 

suppress-events

        这个参数用于FreeSWITCH事件系统。它是一个逗号分隔的字符串,它限定了获取自定义事件conference::maintenance时,哪些事件不发送给对方。

参数语法: <param name="suppress-events" value="add-member,del-member"/>

 

sound-prefix

        这个参数设定检索会议语音文件的缺省路径。

参数语法:<param name="sound-prefix" value="/usr/local/freeswitch/sounds/"/>

 

自定义提示音

         在会议中发生某些事件时,会向用户播报一些提示音,有许多参数可以用于自定义提示内容。除了入会与离会的提示音是向所有成员播报之外,其他所有的声音都是在与会者的独立通道中播放的。

        所有声音文件的定义格式都是这样的: <param name="sound-name" value="file.wav"/>

  • muted-sound某个成员静音时听到的声音
  • unmuted-sound:某个成员取消静音时听到的声音
  • alone-sound当场中只有一个成员时听到的提示音
  • enter-sound当新成员入会时,所有与会者听到的提示音
  • exit-sound当成员离会时,其他所有成员听到的提示音
  • kicked-sound被踢出会议时听到的提示音
  • locked-sound尝试接入锁定的会议时听到的提示音
  • is-locked-sound会议被锁定时,与会者听到的提示音
  • is-unlocked-sound会议解锁时,与会者听到的提示音
  • pin-sound要求用户输入PIN码的提示音
  • bad-pin-sound输入PIN码错误时听到的提示音
  • perpetual-sound一种特殊的设置——它永远在一个连续的循环中播放声音。这可以用于广播销售或紧急消息。
  • moh-sound:一个文件或资源句柄,当会议中只有一名成员时,向他播放这个资源。一旦有第二个人入会,除非有mod-wait设定(如前所述),否则立刻停止播放
  • max-members-sound如果会议满员,有人尝试继续接入会议,将听到这个提示音

caller-controls

           会议中可以配置一些呼叫者控制组,它们开放一些命令,与会者在活跃会场中可以通过按键音执行这些命令。可执行命令有:调整会议音量、对自己静音/解除静音,或其它更高级的选项,例如向个人播放菜单或将人们从一个会议转移到另一个会议。

          呼叫者控制基于会议开始时所应用的预置模板。比如,你可以指定一个控制组(如:按0静音、按1调低音量、按3调高音量),然后把它应用到三个不同的会议中。这些设置在会议开始时(第一个人入会)应用,并在整个会议持续期间生效(最后一个成员退出之前)。你不能在同一个会议中为不同的与会者指定不同的控制集。

          不要把你的控制组命名为"default"或"none"。这些是保留关键字,它们分别对应预置的缺省映射和没有映射的场景。

下面是一个呼叫者控制组的配置实例:

<caller-controls>
<group name="standard-keys">
<control action="vol talk dn" digits="1"/>
<control action="vol talk zero" digits="2"/>
<control action="vol talk up" digits="3"/>
<control action="transfer" digits="5" data="100 XML default"/>
<control action="execute_application" digits="0" data="playback conf_help.wav"/>
<control action="execute_application" digits="#" data="execute_dialplan conference-menu"/>
</group>
</caller-controls>

 

        前面这个示例创建了一个叫“standard-keys”的caller-controls profile。按键1、2、3分别对应调低音量、音量正常化,和调高音量;按键5把按键的参与者转移到extension 100上;按键0和#分别执行一个指定的拨号方案APP。

 

缺省的caller-controls 组 "default"的设置如下:

<caller-controls>
<group name="default">
<control action="mute" digits="0"/>
<control action="deaf mute" digits="*"/>
<control action="energy up" digits="9"/>
<control action="energy equ" digits="8"/>
<control action="energy dn" digits="7"/>
<control action="vol talk up" digits="3"/>
<control action="vol talk zero" digits="2"/>
<control action="vol talk dn" digits="1"/>
<control action="vol listen up" digits="6"/>
<control action="vol listen zero" digits="5"/>
<control action="vol listen dn" digits="4"/>
<control action="hangup" digits="#"/>
</group>
</caller-controls>

 

advertise

          会议配置文件中的advertise部分允许你通过FreeSWITCH事件系统向其他服务和订阅方生成状态事件(通告)。这个构想是基于永久性的会议室名称之上生成状态事件,会议室的存在就像一部话机和其它设备一样。外部程序可以监控会议室,并随时获知它的使用状态。

        Advertise设置在Advertise标记中的每个元素中都包含一个会议室名称,例如:

<advertise>
<room name="888@$${domain}" status="FreeSWITCH"/>
</advertise>

 

FreeSWITCH中的WebRTC视频会议设置

        视频会议的设置是音频会议设置的超集。事实上,无论是音频会议,还是视频会议,配置都由同一模块读取,那就是mod_conference。

        仅支持音频的用户也可以加入视频会议,比如说,来自PSTN的用户(显然,他们只能以声音方式在会议中交流,因为他们不能接收或发送视频流)。SIP用户可以用视频方式入会,尤其是软电话和通信APP的用户。但FreeSWITCH视频会议中的王者是WebRTC客户端,特别是走VERTO的客户端,能够利用一系列高级交互功能。VERTO客户端中的女王者是Verto Communicator,我们面向WebRTC浏览器的旗舰会议客户端。我们后面将学习关于她的更多内容。

        完全配置的Freeswitch视频会议启用了所有特殊的VERTO功能,也是一个完全合法的音频会议,如果所有与会者都没有视频处理能力,那么这个会议与纯音频会议将是不可区分的,它不会创建任何视频流,而且不会使用额外的CPU。

Profiles中添加的视频参数

        在/usr/local/freeswitch/autoload_configs/conference.conf.xml的"profile"部分中,我们可以添加许多参数,它们用于控制会议中的视频行为,和VERTO客户端特有的功能。接下来我们描述其中的一部分,如果需要完整的参数列表和扩展的说明,请访问我们的在线文档http://freeswitch.org/confluence,并搜索"mod_conference"。

 

video-mode

        设置视频会议的视频处理模式。透传模式(passthrough)没有进行编码转换。转码(transcode)模式允许转换多种编码格式。复用(mux)模式允许把多个参与方视频合成到同一路视频画面中。允许的参数值:mux, transcode, passthrough。显然透传模式的CPU开销最小。

参数语法:<param name="video-mode" value="mux"/>

缺省值:passthrough

 

video-layout-name

        指定视频布局的名字,这个名字来自conference_layouts.conf.xml或是以"group:"打头的组。这个配置项将启用mux视频模式。没有设置这个参数将按楼层切换演示视频。

参数值可以是"layout-name"的格式或group:"group-name"的格式(也就是说,组的名字必须以"group:"打头)。

 

参数语法:<param name="video-layout-name" value="2x2"/>

 

video-canvas-size

        mux 模式下,画布的像素尺寸。它的值必须是"integer"x"integer"的格式。

 

参数语法:<param name="video-canvas-size" value="1920x1080"/>

 

video-no-video-avatar

        为没有视频源的成员准备的PNG文件的路径。

 

参数语法: <param name="video-no-video-avatar" value="/tmp/novideo.png"/>

 

video-mute-banner

        为成员设置视频静音横幅文本、字体、字体大小、字体颜色和背景色。字体缩放有效值5-50,fg/bg(前景/背景)十六进制颜色代码,除文本之外的所有设置都是可选的。

        参数值可以是"layout-name"的格式或group:"group-name"的格式(也就是说,组的名字必须以"group:"打头)。

参数语法:<param name="video-mute-banner" value="{font_face=/path/to/font.ttf,font_scale=5,bg=#000000,fg=#FFFFFF}VIDEO MUTED"/>

 

caller-controls里增加的视频相关操作

  • vmute视频静默。把这个成员的视频切换进会议
  • vmute on这个成员的视频流静默启用,他的视频不进入会议
  • vmute off取消这个成员的视频静默,他的视频进入会议
  • vmute snap拍摄此用户在vmute中使用的视频快照
  • vmute snapoff丢弃vmute视频快照

member-flags里增加的视频选项

  • join-vid-floor把这个成员锁定为焦点视频流
  • no-minimize-encoding绕过视频转码最小化器并为此成员单独编码视频
  • vmute进入会议视频 静默

 

conference-flags里增加的视频选项

  • minimize-video-encoding每个输出编解码使用一个视频编码器
  • livearray-json-status激活一种状态传输机制,以一种机器解析方式描述与会者的状态

屏幕布局

        在/usr/local/freeswitch/conf/autoload_configs/conference_layouts.conf.xml文件中包含了一些视频相关的配置,它们指定了会议期间组织和填充屏幕的不同方式。

        主持人可以在会议期间动态变更视频的布局以适应不断变化的场景:演示期间,你可能希望演示者的头像可以叠加到她正共享的屏幕上,最终效果就是在PPT上叠加上演讲者的一个小小的头像,形成一个画中画。

        布局定义组织结构有一个标识的名字,将屏幕分成区域的坐标,以及视频流在每个区域的比例。所有的数字,包括坐标和比例因子,都在0-360范围内,并且与画布成比例。因此,将屏幕空间划分为3行3列大小相同的区域(例如,3x3配置)的布局,它的作用在1920x1080画布和800x600画布上是一样的。

<layout name="3x3">
<image x="0" y="0" scale="120"/>
<image x="120" y="0" scale="120"/>
<image x="240" y="0" scale="120"/>
<image x="0" y="120" scale="120"/>
<image x="120" y="120" scale="120"/>
<image x="240" y="120" scale="120"/>
<image x="0" y="240" scale="120"/>
<image x="120" y="240" scale="120"/>
<image x="240" y="240" scale="120"/>
</layout>

布局组

        布局可以按命名的“组”进行分组。如果您在会议上使用“group:groupname”的视频布局,那么FreeSWITCH动态调整视频布局,在组成员中选择最合适显示所有成员的布局方式。

<group name="grid">
<layout>1x1</layout>
<layout>2x1</layout>
<layout>1x1+2x1</layout>
<layout>2x2</layout>
<layout>3x3</layout>
<layout>4x4</layout>
<layout>5x5</layout>
<layout>6x6</layout>
<layout>8x8</layout>
</group>

 

        比方说使用上述示例中的组定义,当第一个成员入会时,将适用1x1的布局。然后,随着更多成员加入,布局将动态选择以适应 所有参与者。当成员数从36增长到37的时候,FreeSWITCH会把布局从"6x6"变更为"8x8"。是的,在1920x1080像素的屏幕上,我们可以同时容纳64个与会者的视频流!


 

FreeSWITCH会议操作

            怎样在拨号方案中调用会议?怎么把一路来电加入已经开始的会议中?怎样在会议中发起呼叫拉入新的成员?此外,会议和视频会议完全可以变得更富有成效和更有趣:避免与会者一个接一个地发言;如果视频焦点能够跟随发言者;如果演讲者演讲时能够分享他的屏幕(过一会后,任何幻灯片都会变得无聊)。

           下一节,我们将讲述如何调用管理会议。

 

Conference APP (拨号方案)

        呼叫可以通过conference APP接入会议,一般是通过拨号方案调用发起的,通过event socket的API调用发起的场景也很常见。将呼叫者连接到会议的一般语法如下:

<action application="conference" data="confname@profilename"/>

 

         其中confname参数是任意会议室的名字,而profilename是会议配置文件中定义的(如本章前面所述)。引导到同一个confname@profilename的所有成员,将加入同一个会议室。

           你可以选择性地传递一些特定参数给conference APP,格式是在profile名字之后添加+PIN+flags,下面是一个示例:

 

<action application="conference" data="confname@profilename+12345+flags{ mute|deaf|waste|moderator|vmute}"/>

 

        如果你只需要传递标记,而不要求PIN码,这时引导PIN码的加号不能省略,就如(请注意连续的两个"+"):

<action application="conference" data="confname@profilename++flags{ mute|deaf|waste|moderator|vmute}"/>

 

          当第一个与会者接入时,会议按需创建。创建时,profile的设置以及指定的会议PIN码,将连同会议一起记录在内存中。这一点很重要,加载内存的更改,不会影响正在进行中的会议。比如说,一旦一个会议开始时设置了PIN码,任何后续加入这个会议的参与者都必须指定同一PIN码。

          会议的生命周期持续到最后一名成员离会时。

下面是桥接会议时,data参数的一些示例和说明:

 

data字段值

说明

confname

Profile为"default",没有任何或PIN码

confname+1234

Profile 为"default",PIN码是1234

confname@profilename+1234

Profile为 " profilename ",PIN码是1234,没有标记

confname@profilename++flags{mute|waste}

Profile为 " profilename ",没有PIN码,设置了多个标记

confname+1234+flags{mute|waste|vmute}

Profile 为"default",PIN码是1234,带有三个标记

 

          请注意,虽然有些参数是可选的,但它们的顺序非常重要。

控制活动会议

        有许多CLI和API命令可用于控制活动的会议。最常用的命令是踢除成员;调整音量;向一个与会者的视频流添加文本横幅(比如说标识他的名字和角色);或者发起呼叫(邀请其他人加入会议)。


        前面这张截图显示了了所有FreeSWITCH控制台可用的API命令。在控制台上输入"conference",然后敲击两下TAB键就可以看到(第一次敲击TAB键将列出所有运行中的会议,在我们的案例中只有一个,第二次敲击TAB就会显示与这个会议相关的所有可用命令)。比如说,你可以用以下命令变更视频布局:

conference 3500-lab.opentelecomsolutions.com vid-layout 3x3

 

        或者在member_id为"2"的与会者的视频流底部加上一个标题(注意单引号的使用保证横幅内容的完整):

 

conference 3500-lab.opentelecomsolutions.com vid-banner 2 'Giovanni Maruzzelli <[email protected]>'

 

        更多扩展说明,请访问我们的在线文档http://freeswitch.org/confluence,并搜索 "mod_conference"。

 

邀请人员加入会议

          FreeSWITCH可以向外发起一呼呼叫,并把被叫接入会议。这可以通过APP "conference_set_auto_outcall"和它的辅助通道变量来完成。

        但是,由FreeSWITCH管理员(或会议主持人)来执行这个动作或许会更有用,可以实时通过fs_cli交互:

 

conference 3500-lab.opentelecomsolutions.com bgdial user/1010 +12125551212 weekly_conference

 

Verto Communicator与Video-WebRTC会议

        Verto Communicator是我们的旗舰WebRTC客户端,专门开发用于参与、管理和主持FreeSWITCH视频会议。在华丽的用户界面之下,有VERTO协议的强大支撑。VERTO协议的设计对于web开发人员来说很容易上手 ,它是基于JSON的。JSON + WebSocket意味着双向实时交换信息的能力。只有你看到以下这些,对这一点才会有深切的感受:Verto Communicator(VC)会实时更新聊天信息和参与者数组;参与者说话时伴随着图标闪烁;她自己静音时,麦克风和摄像头的颜会随之改变。

        VC允许参与者自行设置自身相关的一些内容:出入的音量、音频静音、视频静默、选择要麦克风和摄像头(重要的是,如果你有一台笔记本,兼作工作站,你可以躺在桌子旁边,附在华丽的USB 3供电的集线器和背投显示器)。

        此外,VC在它的GUI中公开了所有管理员工具:踢人、静音、视频静默、选择流、添加标题、快照、会话录音、播放音/视频文件、改变布局……重要的是这些都是通过点击鼠标完成的。

        要安装支持WebRTC视频会议所需要的各种组件和VC,请参考本书的第五章“WebRTC,SIP和Verto”。

 

设置

        当你第一次连接Verto Communicator页面时,呈现在你面前的是一个简约的小窗口,它请求你输入姓名(稍后你的名字将出现在会议参与者名单和聊天窗口中)。如果单击“设置”链接,则该窗口将展开,你可以输入所有连接细节,包括连接到哪个服务器、授权用户名和密码。


        然后,有可能需要你选择使用哪些多媒体源,比如麦克风、摄像头和扬声器(你可以轻松地在树状控件中选择音频资源:笔记本电脑内置、USB声卡、摄像头内的麦克风):


        现在,你已经完成设置并登陆,可以拨号了:


成员列表

        加入会议后,你将在右侧看到带有交互头像和状态图标的成员列表。


参与者GUI命令和聊天

        点击"chat"选项卡,你会看到实时同步的聊天窗口,当你将鼠标悬停在主窗口上时,屏幕上会显示用户操作命令:麦克风切换、网络摄像机切换、全屏、屏幕共享、音频输出选择和拨号盘。


主持人GUI命令


        如果你是以主持人身份连接的,那么你的屏幕上会有更多的控制功能:除了参与者控件之外,主持人还有录音/停止录音、播放/停止播放、抓取快照和一个设置屏幕布局的下拉菜单。

        此外,会议主持人还能点击右边参与者列表中的音频和视频小图标,切换他们的媒体,可以给他们添加标题(比如说姓名和角色),设置视频优先级(会议焦点),等等。


屏幕共享

        共享你的整个屏幕,或一个应用窗口是很简单的。只需要点击参与者控件中的屏幕共享("screenshare")按键,将会弹出一个提示框,选择你希望共享的内容就可以了。我决定共享我写这一章时用的LibreOffice窗口。此外,我将会议布局更改为“重叠”("overlaps"),现在会议参与者是在我的应用程序窗口(可以是幻灯片、电子表格、终端等)上叠加的实时视频小窗口。


总结

        这一章我们学习了FreeSWITCH的会议功能。在简要概述音频和视频会议技术之后,我们了解了Freeswitch如何支持它们的。

       我们学习了如何在FreeSWITCH中设置音频会议和使用它的丰富功能。进一步了解如何扩展设置会议的视频能力,和WebRTC交互。

        然后,我们了解了怎样在FreeSWITCH控制台上管理和操纵会议,怎样从拨号方案呼入会议,怎样从会议中发出邀请。

        本章结束时,我们对会议参与者和主持人的Verto Communicator特性和功能进行了可视化演示。

       我们已经准备好为我们的用户提供领先的会议服务!

        下一章,我们将研究电信实施者的可怕敌人:NAT,并介绍FreeSWITCH的设计中是怎样解决它的。

 

猜你喜欢

转载自blog.csdn.net/yetyongjin/article/details/102628453