准备
下载
github:https://github.com/signalwire/freeswitch
windows:https://files.freeswitch.org/windows/installer/x64/
安装
windows如果安装在C盘,运行时可能需要管理员权限运行才能成功。
客户端
测试时,可安装MicroSIP客户端进行对讲测试。
使用
账号密码
FreeSWITCH 默认安装后自带一些示例账号,通常位于 conf/directory/default/ 目录下的 XML 配置文件中。
默认账号为1000-1019,密码为1234。
默认密码定义在conf/vars.xml中的<X-PRE-PROCESS cmd="set" data="default_password=1234"/>
创建账号密码,即在 conf/directory/default/ 目录中创建对应的xml,格式参考已有的默认账号密码的xml。
创建xml后,在运行的console窗口/cli窗口中执行下面命令进行重新加载目录配置:
reloadxml
sofia profile internal rescan
查询(UUID)
当执行某些操作时,如originate拉会议等,处理执行命令时会返回操作的UUID,另外还可以用下面指令查看当前所有活动的通话(通道)的详细信息:
show channels
另外可用下面命令查询已注册在线设备:
sofia status profile internal reg
日志
在程序根目录\log\freeswitch.log可查看操作日志,有DEBUG信息,推荐用vscode进行查看,可动态刷新(需点击下窗口再自动重新读取)。
对讲
基本
服务运行后,可使用MicroSIP等客户端进行连接,并且测试两个客户端互相音视频电话是否正常,测试时由客户端主动发起。
拉起对接
在console窗口/cli窗口中,可以通过服务器让两个客户端进行对讲,命令如下:
1000为一方,1001为另外一方。
该命令流程为:呼叫客户端 A(1000),在客户端 A 接听后,将其桥接到客户端 B(1001)。
originate user/1000 &bridge(user/1001)
音频广播
使用服务器本地音频文件与客户端进行对讲,在console窗口/cli窗口中,使用下面命令,可实现将音频文件当作对讲音源,与另外一个客户端进行对讲(即将音频推送给某个客户端):
注意音频文件需要wav格式,且路径不要包含中文或空格。
originate user/1000 &playback(/path/to/audio.wav)
freeswitch默认只支持wav格式的文件,如果要支持mp3,则需要开启mod_shout模块,在console窗口/cli窗口中,使用下面命令:
load mod_shout
会议
查询
通过查询,可查询出会议中对应客户端的通话(通道)的详细信息,如member_id,UUID,音量等。
下面命令实际也是查出UUID列表,跟
show channels
命令差不多,只是只显示会议相关的。另外可以查询出member_id,用于静音等操作。
//所有会议的所有列表
conference list
//漂亮的显示
conference list pretty
//简洁的显示
conference list summary
//某个会议的所有列表
conference <conference_name> list
开启会议
可通过下面命令,将多个客户端拉到通过会议,进行多方会议通话。
my_conference为具体房间号,任意填写。
originate user/1000 &conference(my_conference)
originate user/1001 &conference(my_conference)
originate user/1002 &conference(my_conference)
结束会议
对于结束会议,需要在上位机平台程序设计时,存储好每次originate的UUID,或通过上面的查询相关命令查询出操作,然后依次移除客户端(挂断客户端),比如上面对应的,要结束my_conference会议,则执行1000,1001,1002对应的kill UUID,得所有都执行完,会议才算结束:
//方式1
uuid_kill <uuid>
//方式2
conference <conference_name> kick <member_id>
另外,也可一次性剔除所有客户端,即销毁会议:
//被踢出人员播放提示音
conference <conference_name> kick all
//被踢出人员不播放提示音
conference <conference_name> hup all
静音
在进行会议时,可进行静音功能,如下指令:
//拉会议时默认静音
originate user/1000 &conference(my_conference+flags{mute})
//拉会议时,只有一个成员时不播放背景声
originate user/1000 &conference(my_conference+flags{nomoh})
//单个人员静音
conference <conference_name> mute <member_id>
//单个人员取消静音
conference <conference_name> unmute <member_id>
//所有人员静音
conference <conference_name> mute all
//所有人员取消静音
conference <conference_name> unmute all
音量调节
使用 conference API 的 volume_in 和 volume_out 参数,可以分别调整某个参与者的输入音量(麦克风音量)和输出音量(扬声器音量)。
音量值,范围通常为 -4 到 +4,表示音量的增益或衰减。
<member_id>可为all,代表调整所有人。
conference <confname> volume_in <member_id> <volume>
conference <confname> volume_out <member_id> <volume>
对于音频广播,上面的调节有用,也可用下面的调节指令:
conference <confname> file-vol <volume>
音频广播
在有会议存在时,可以使用服务器本地音频文件加入会议,进行音频广播。
音频的质量除了跟文件本身的采样率有关系,也跟第一个发起对讲时,对方所使用的采样率有关系,越高对应音频播出质量也更好,另外在conf\autoload_configs\conference.conf.xml中有配置采样率。
方式1
使用conference play 命令,其中my_conference为会议名称,需要先用originate创建相关会议后,再执行:
临时加入的用户也能播,喊话和音频都能一起混合。
支持一次性播放到会议中多个客户端。
该指令启用mod_shout模块后,也能支持MP3,但是播出效果比wav文件差很多。
只有将会议所有人对应的UUID都kill/kick掉,该播放命令才算失效,不然还是一直在的,不要重复执行,不然存在两个声音听着就不对。
多次执行conference play,音频不是以混音模式,而是队列顺序播放。
//所有人
conference my_conference play C:\Users\Heawill\Desktop\ponce.wav
//单独
conference my_conference play C:\Users\Heawill\Desktop\ponce.wav <member_id>
主动停止,可使用下面命令:
//停止队列中的所有歌曲
conference my_conference stop all
//停止队列当前歌曲,如果有下一首,则直接到下一首
conference my_conference stop current
//单独某个客户端
conference <confname> stop [current|all] [<member_id>]
另外,可在播放时,调整音量的增益或衰减(单位dB):
取值在-20到+20之间,对于正数可不加+符号,0为原始音量。
conference my_conference play {vol=+5}C:\Users\Heawill\Desktop\ponce.wav
方式2
在originate创建相关会议后,存储相关UUID或UUID查询相关命令查询出具体操作,然后依次进行音频添加:
该命令执行后,对应的客户端,喊话和接听喊话会变成无声音,只能播出该音频。
对于会议中如果有多个客户端,都需要依次根据uuid执行才行。
该指令启用mod_shout模块后,也能支持MP3。
uuid_broadcast <uuid> playback::C:\Users\Heawill\Desktop\ponce.wav
录音
开启录音使用下面命令,停止需会议销毁时才会停止:
conference <confname> record <file-path>
中途停止录音:
conference <confname> norecord <file-path>
更多
更多api指令参考官网文档:
https://rts.cn/freeswitch/FreeSWITCH-Explained/Modules/mod_conference_3965534#api-reference
另外参考:
https://blog.csdn.net/dewk37273997/article/details/102330553/