FreeSWITCH 1.6 Video
THIS PAGE IS BEING RETIRED, USE Debian 10 Buster (Obsolete) INSTEAD. MOST OF THESE STEPS HAVE ALREADY BEEN INTEGRATED INTO THE PACKAGES.
About
Detailed information on how to properly build and test the new FreeSWITCH™ 1.6 with awesome video conferencing support.
Introduction
FreeSWITCH™ 1.6 introduces new video features. See a working demonstration on the VoIP User Conference 539 of 1 May, 2015 putting the FreeSWITCH™ video conference through its paces.
What's new
FreeSWITCH™ now features video transcoding.
A few new modules were added with video codec support, such as mod_av, mod_vlc, mod_vpx, and others. Based on that, mod_conference can now do a video MCU, which introduces the new video layouts and group layouts. The video layouts feature allows you to set specific locations for the videos participants, floor holder and presenter.
Because FreeSWITCH™ core now supports video, you can do playback and record with video support, so you can do things like 'record' and stream to a live YouTube event over RTMP, etc. Also, mod_verto now adds the ability to select video settings like resolution, bandwidth, camera selection and desktop sharing, all these features are demonstrated in the Verto HTML Demo page.
For more info, check out mod_conference page. Let's get all these new features configured!
Installation
Setting up the repos
Debian Jessie is required for this setup. A clean installation would make things easier and if you just follow the following steps everything will work smoothly.
A new set of dependencies was added to support the new features. Some of these dependencies were developed by the FreeSWITCH™ core team and the packages were added to our repository.
Let's configure the Jessie repo:
Double click to select all commands, then copy and paste in your shell session.
Enable Debian Jessie repository
echo "deb http://files.freeswitch.org/repo/deb/freeswitch-1.6/ jessie main" > /etc/apt/sources.list.d/freeswitch.list
wget -O - http://files.freeswitch.org/repo/deb/freeswitch-1.6/key.gpg |apt-key add -
apt-get update
Get FreeSWITCH
Choose from the packages listed to complete your FreeSWITCH™ installation.
apt-cache search freeswitch | less
We suggest that you install the Vanilla meta package to get a basic running installation.
apt-get install freeswitch-all
If you desire other FreeSWITCH modules, run the apt-cache search
command above and choose from those listed by running apt-get install <module_name>
You might get systemd errors. Replace freeswitch.service in /lib/systemd/system/ with this in that case:
freeswitch.service Unit File for FS Package
[Unit]
Description=freeswitch
After=syslog.target network.target local-fs.target
[Service]
; service
Type=forking
PIDFile=/run/freeswitch/freeswitch.pid
PermissionsStartOnly=true
ExecStart=/usr/bin/freeswitch -u freeswitch -g freeswitch -ncwait -nonat -rp
TimeoutSec=45s
Restart=on-failure
; exec
WorkingDirectory=/usr/bin
User=root
Group=daemon
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=60000
;LimitSTACK=240
LimitRTPRIO=infinity
LimitRTTIME=7000000
IOSchedulingClass=realtime
IOSchedulingPriority=2
CPUSchedulingPolicy=rr
CPUSchedulingPriority=89
UMask=0007
[Install]
WantedBy=multi-user.target
After that do:
systemctl daemon-reload && systemctl start freeswitch
The packages might not set up the configuration in /etc/freeswitch, you then can copy the files manually:
cp -a /usr/share/freeswitch/conf/vanilla /etc/freeswitch
Installing from Source
Now that we have our repo configured, let's install the deps:
Dependencies
apt-get install -y --force-yes freeswitch-video-deps-most
Compiling
With all the dependencies installed, we can now properly build FreeSWITCH™ 1.6:
Checkout FreeSWITCH source
# because we're in a branch that will go through many rebases it's
# better to set this one, or you'll get CONFLICTS when pulling (update)
git config --global pull.rebase true
# then let's get the source
cd /usr/src/
git clone https://freeswitch.org/stash/scm/fs/freeswitch.git freeswitch.git
cd freeswitch.git
./bootstrap.sh -j
./configure
Enable mod_av:
Enabling optional modules
perl -i -pe 's/#applications\/mod_av/applications\/mod_av/g' modules.conf
Let's make and install the project:
Compiling the code
make
make install
make cd-sounds-install
make cd-moh-install
make samples
Configuring
Certificates
It's mandatory that you use valid certificates on this setup. If you're setting up your own CA we can't guarantee that it'll work and we can't help you.
You can set up your certs at http://www.startssl.com/ .
Let's create our directory to store the certificates that will be used by FreeSWITCH™ and Apache:
mkdir -p /usr/local/freeswitch/certs/
After creating the certs dir, we need to set our wss.pem, agent.pem and cafile.pem:
Certs files
# NOT NEEDED if you will use following section on SELF SIGNED certificates
/usr/local/freeswitch/certs/wss.pem # CERT, KEY AND CHAIN files separated by \n
/usr/local/freeswitch/certs/agent.pem # CERT file AND key file separated by \n
/usr/local/freeswitch/certs/cafile.pem # CHAIN file or root CA
Make sure you generate those files with proper layout, as described above, otherwise you'll get WS SETUP FAILED messages in FreeSWITCH™ console and things won't work.
Self-signed certificates
If you really really want to use your own self-signed certificates, knowing that we will not support it, follow these steps:
Certs files
# Create certificates:
export DOMAIN=self.bkw.org
wget http://files.freeswitch.org/downloads/ssl.ca-0.1.tar.gz
tar zxfv ssl.ca-0.1.tar.gz
cd ssl.ca-0.1/
perl -i -pe 's/md5/sha256/g' *.sh
perl -i -pe 's/1024/4096/g' *.sh
./new-root-ca.sh
./new-server-cert.sh $DOMAIN
./sign-server-cert.sh $DOMAIN
mkdir /usr/local/freeswitch/certs
cat $DOMAIN.crt $DOMAIN.key > /usr/local/freeswitch/certs/wss.pem
# Setup Sofia TLS:
cat $DOMAIN.crt $DOMAIN.key > /usr/local/freeswitch/certs/agent.pem
cat ca.crt > /usr/local/freeswitch/certs/cafile.pem
# vars.xml:
<X-PRE-PROCESS cmd="set" data="internal_ssl_enable=true"/>
<X-PRE-PROCESS cmd="set" data="external_ssl_enable=true"/>
# Restart FreeSWITCH.
## Now make sure your system has ca.crt imported so it will trust your new found hotness.
# Setup Apache:
# default-ssl:
SSLCertificateFile /usr/local/freeswitch/certs/wss.pem
SSLCertificateKeyFile /usr/local/freeswitch/certs/wss.pem
SSLCertificateChainFile /usr/local/freeswitch/certs/wss.pem
# TEST:
openssl s_client -connect $DOMAIN:443
openssl s_client -connect $DOMAIN:5061
openssl s_client -connect $DOMAIN:5081
openssl s_client -connect $DOMAIN:8082
# Depending on what you've setup you'll see:
subject=/C=US/ST=Oklahoma/L=McAlester/O=Tonka Truck/OU=Secure Web Server/CN=self.bkw.org/emailAddress=brian@bkw.org
issuer=/C=US/ST=Oklahoma/L=McAlester/O=Whizzzzzzy Bang Bang/OU=Certification Services Division/CN=WBB Root CA/emailAddress=brian@bkw.org
# Or there abouts.
# IMPORT THE CA.CRT CERTIFICATE INTO BROWSER !
# BE SURE YOU SET "domain" to self.bkw.org in vars.xml !
WS SETUP FAILED with Self-signed certificates
You cannot login, and FreeSWITCH is reporting (in debug) WS SETUP FAILED : this is because you have not imported your new self-signed certification authority in the browser. It will fail forever.
Import the self signed CA in browser, or visit with the browser the same address and port you will use as wss. Eg: if you have wss://192.168.1.34 then visit from same browser https://192.168.1.34 , then accept the certificate.
This (accept the certificate from https) is not the optimal solution, and can bring problems and failures to connect.
Optimal solution is to import into your browser your self signed Certification Authority.
Apache with SSL
Note that the HTML does not have to be served from the FreeSWITCH server, it can come from anywhere – the only requirement is that the SSL certificates on the FreeSWITCH server must be trusted.
Enable required Apache modules:
Apache Required Modules
a2enmod ssl
a2enmod rewrite
a2ensite default-ssl
Copy the CHAIN, CERT and KEY files to /etc/ssl/private:
Copy cert files to /etc/ssl/private
# NOT NEEDED if you made previous section SELF SIGNED certificates
cp chain.pem /etc/ssl/private/chain.pem
cp cert.pem /etc/ssl/private/cert.pem
cp key.pem /etc/ssl/private/key.pem
Setup Apache default SSL enabled host:
Apache SSL Configuration
# NOT NEEDED if you made previous section SELF SIGNED certificates
perl -i -pe 's/SSLCertificateFile.*/SSLCertificateFile \/etc\/ssl\/private\/cert.pem/g' /etc/apache2/sites-available/default-ssl.conf
perl -i -pe 's/SSLCertificateKeyFile.*/SSLCertificateKeyFile \/etc\/ssl\/private\/key.pem/g' /etc/apache2/sites-available/default-ssl.conf
perl -i -pe 's/#SSLCertificateChainFile.*/SSLCertificateChainFile \/etc\/ssl\/private\/chain.pem/g' /etc/apache2/sites-available/default-ssl.conf
Rewrite HTTP to HTTPS access:
Rewrite HTTP to HTTPS
perl -i -pe 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf
printf "RewriteEngine On\nRewriteCond %%{SERVER_PORT} 80\nRewriteRule ^(.*)$ https://MY.DOMAIN.NAME/\$1 [R,L]" > /var/www/html/.htaccess
printf "\n\nRewriteCond %%{SERVER_PORT} 443\nRewriteRule ^$ https://MY.DOMAIN.NAME/verto [R,L]" >> /var/www/html/.htaccess
Make sure to replace MY.DOMAIN.NAME with your FQDN in the commands above.
Improving Apache SSL Security settings:
Apache SSL Tweaks
perl -i -pe 's/ServerSignature On/ServerSignature Off/g' /etc/apache2/conf-available/security.conf
perl -i -pe 's/ServerTokens OS/ServerTokens Prod/g' /etc/apache2/conf-available/security.conf
perl -i -pe 's/SSLProtocol(.*)/SSLProtocol All -SSLv2 -SSLv3/g' /etc/apache2/mods-available/ssl.conf
perl -i -pe 's/SSLCipherSuite(.*)/SSLCipherSuite AES128+EECDH:AES128+EDH/g' /etc/apache2/mods-available/ssl.conf
perl -i -pe 's/#SSLHonorCipherOrder on/SSLHonorCipherOrder on/g' /etc/apache2/mods-available/ssl.conf
Now restart Apache to reflect the new settings:
/etc/init.d/apache2 restart
Test Certificates
You can use the following script to test your certificate setup. Create a file called test_tls.sh and paste this content:
Test TLS domain
#!/bin/bash
DOMAIN=MY.DOMAIN.NAME
echo 'x' | openssl s_client -connect $DOMAIN:443 > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "$DOMAIN:443 TLS FAILED!"
fi
echo 'x' | openssl s_client -connect $DOMAIN:5061 > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "$DOMAIN:5061 TLS FAILED!"
fi
echo 'x' | openssl s_client -connect $DOMAIN:5081 > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "$DOMAIN:5081 TLS FAILED!"
fi
echo 'x' | openssl s_client -connect $DOMAIN:8082 > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "$DOMAIN:8082 TLS FAILED!"
fi
Then you can run the script:
chmod +x test_tls.sh
./test_tls.sh
If one of the above tests fail you MUST stop now and try to fix the issue before continuing this guide.
Demo Files
Verto demo pages uses some videos to demonstrate the new video features. Let's get this environment set up:
ln -s /usr/src/freeswitch.git/html5/verto/video_demo /var/www/html/verto
mkdir -p /var/www/html/sounds/
Dialplan:
cp -f /usr/src/freeswitch.git/html5/verto/video_demo/dp/dp.xml /usr/local/freeswitch/conf/dialplan/default/0000_dp.xml
fs_cli -x 'reloadxml'
FreeSWITCH™ default dialplan checks if you're using the default password and warns you in the console about this security role, this extensions has an sleep of 10 seconds. Let's disable this for now so we don't have to wait 10 seconds each time we make a test call:
perl -i -pe 's/default_password/disabled_default_password_checking/g' /usr/local/freeswitch/conf/dialplan/default.xml
The proper way to fix this is by changing your default password to something more secure. Change it ASAP.
Bridging from WebRTC (mod_verto) to PSTN/ITSPs
WebRTC is slow to establish media. So we need to provide SDP asap.
We can do this by answering and sending some silent packets, instead of waiting for normal call setup:
Dialplan:
<extension name="itsp_send_call">
<condition field="destination_number" expression="^(\d+)$">
<action application="answer"/>
<action application="playback" data="silence_stream://2000"/>
<action application="set" data="effective_caller_id_number=333444555"/>
<action application="set" data="effective_caller_id_name=ciaociaociao"/>
<action application="bridge" data="{absolute_codec_string=pcmu}sofia/gateway/itsp/$1"/>
</condition>
</extension>
Starting FreeSWITCH
The default and preferred init system on Debian 8 (and CentOS 7) is Systemd. If you didn't revert to system V and you're compiling Freeswitch like you are, the building mechanism now recognises that you're using a Systemd based distribution and it will offer you a script that will create the required user and group and install the Systemd files, so you can just start Freeswitch. You can install it using:
build/startup/install_systemd.sh
If this works out for you, you can skip the following two sections (about owners/permissions and Systemd).
Set Owner and Permissions
Because you most likely built FreeSWITCH™ as root you must now create the user 'freeswitch' in group 'freeswitch' and change the FS files to owner = freeswitch and group = freeswitch and set the file mode appropriately. Execute the following commands as user root:
Set owner and permissions
# create user 'freeswitch'
# add it to group 'freeswitch'
# change owner and group of the freeswitch installation
cd /usr/local
groupadd freeswitch
adduser --disabled-password --quiet --system --home /usr/local/freeswitch --gecos "FreeSWITCH open source softswitch" --ingroup freeswitch freeswitch
chown -R freeswitch:freeswitch /usr/local/freeswitch/
chmod -R ug=rwX,o= /usr/local/freeswitch/
chmod -R u=rwx,g=rx /usr/local/freeswitch/bin/*
systemd
systemd is the replacement service management system that replaces System V init. It is quite thorough and requires much simpler configuration scripts called Unit Files. systemd can start FreeSWITCH™ at boot time, monitor the application, restart it if it fails, and take other useful actions.
At the time of this writing (August 2015) the optimum systemd unit file is not certain, but the following have been proven to work on Debian 8.1 systems. If you have discovered a better approach, please update this section or submit a JIRA ticket so that we can capture this knowledge for the community. If you prefer to use the old sysvinit system, then use the instructions on the Debian 7 page.
The systemd unit file you're going to use should be something similar to this, this works fine when Freeswitch is installed using the methods above. The pre-compiled packages come with their own systemd files and scripts to install them, although you may certainly use this as a guide if you have trouble; but be sure to observe the correct file locations as they differ between compiled installations and package installations.
When troubleshooting systemd difficulties look for messages in /var/log/syslog
and /var/log/daemon.log
and grep for freeswitch messages.
The unit file start Freeswitch as root, so Freeswitch can setup priority, create some directories if needed, etc. Then it will continue running as user/group Freeswitch.
systemd unit file FreeSWITCH built from MASTER
; This file in installations built from Master can be found in
; /usr/src/freeswitch.git/debian
; or
; /usr/src/freeswitch/debian
[Unit]
Description=freeswitch
After=syslog.target network.target local-fs.target
[Service]
; service
Type=forking
PIDFile=/usr/local/freeswitch/run/freeswitch.pid
PermissionsStartOnly=true
ExecStart=/usr/local/freeswitch/bin/freeswitch -u freeswitch -g freeswitch -ncwait -nonat -rp
TimeoutSec=45s
Restart=on-failure
; exec
WorkingDirectory=/usr/local/freeswitch/bin
User=root
Group=daemon
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=60000
;LimitSTACK=240
LimitRTPRIO=infinity
LimitRTTIME=7000000
IOSchedulingClass=realtime
IOSchedulingPriority=2
CPUSchedulingPolicy=rr
CPUSchedulingPriority=89
UMask=0007
[Install]
WantedBy=multi-user.target
Now that the systemd unit file has been set up, you can copy it to the /etc/systemd/system directory where systemd looks for local customized files that won't be overwritten by systemd updates. Linking is possible to, but will give you issues when enabling (https://bugzilla.redhat.com/show\_bug.cgi?id=955379)
cp /usr/src/freeswitch.git/debian/freeswitch-systemd.freeswitch.service /etc/systemd/system/freeswitch.service
Next, notify systemd to look for changes in its configuration:
systemctl daemon-reload
Now you are ready to start FreeSWITCH for the first time. Because FS is owned by user freeswitch it should create its databases and log files under that user (instead of root) so that those files will still be accessible to it under future runs.
systemctl start freeswitch
To stop FreeSWITCH:
systemctl stop freeswitch
To install FreeSWITCH to start at boot time:
systemctl enable freeswitch
Testing Video
At this time you have a fully functional FreeSWITCH™ 1.6 demo system. You can now point your RTC-enabled browser to https://MY.DOMAIN.NAME/verto and you'll see the Verto Demo Page.
You can call for example extension 3500 to enter your first video conference. This is a conference with the video-mcu-stereo profile, that has the video features enabled by default.
After dialing to the conference, you'll hear that you are the only person in the conference and your video will appear on the screen:
When you place your mouse closer to 'Outbound Call' you'll see your user controls:
Now you can invite another caller and your video will be mixed together with the other caller video, and both video swill appear on the screen. The video disposition will behave according to the layout that was configured for this conference room.
FreeSWITCH™ 1.6 has a few layouts configured by default and you can change the video layout on the fly using the conference API, for example:
Video Layouts
freeswitch@internal> conference 3200-my.domain vid-layout
[ 1up_top_left+5] [ 1up_top_left+7] [ 1up_top_left+9] [ 1x1]
[ 1x2] [ 2up_bottom+8] [ 2up_middle+8] [ 2up_top+8]
[ 2x1] [ 2x2] [ 3up+4] [ 3up+9]
[ 3x3] [ 4x4] [ 5x5] [ 6x6]
[ 8x8] [ overlaps] [presenter-dual-horizontal] [presenter-dual-vertical]
[presenter-overlap-large-bot-right] [presenter-overlap-large-top-right] [presenter-overlap-small-bot-right] [presenter-overlap-small-top-right]
freeswitch@internal> conference 3200-video.evolux.net.br vid-layout 3up+4
Change to layout [3up+4]
freeswitch@internal>
Conference
All the new APIs and variables of FreeSWITCH™ 1.6 are already documented on mod_conference page.
Layouts
Definition
With video layouts you can configure specific video locations for your conference members, video floor holder and presenter. FreeSWITCH™ ships with many pre-defined examples and so you can start using the layouts right now.
For more information on how layouts work, check the mod_conference documentation about Custom Conference Layouts.
Examples
These are the pre-defined layouts that comes with FreeSWITCH™:
1up_top_left+5
1up_top_left+7
1up_top_left+9
1x1
1x2
2up_bottom+8
2up_middle+8
2up_top+8
2x1
2x2
3up+4
3up+9
3x3
4x4
5x5
6x6
8x8
overlaps
presenter-dual-horizontal
presenter-dual-vertical
presenter-overlap-large-bot-right
presenter-overlap-large-top-right
presenter-overlap-small-bot-right
presenter-overlap-small-top-right
Attachments:
FreeSWITCH_Verto™_Video_Transcoding_Demo.png (image/png)
FreeSWITCH_Verto™_Video_Transcoding_Demo_conf_3200.png (image/png)
FreeSWITCH_Verto™_Video_Transcoding_Demo_conf_3200_user_controls.png (image/png)
1up_top_left+5.png (image/png)
1up_top_left+7.png (image/png)
1up_top_left+9.png (image/png)
1x1.png (image/png)
1x2.png (image/png)
presenter-overlap-small-top-right.png (image/png)
presenter-overlap-small-bot-right.png (image/png)
presenter-overlap-large-top-right.png (image/png)
presenter-overlap-large-bot-right.png (image/png)
presenter-dual-vertical.png (image/png)
presenter-dual-horizontal.png (image/png)
overlaps.png (image/png)
8x8.png (image/png)
6x6.png (image/png)
5x5.png (image/png)
4x4.png (image/png)
3x3.png (image/png)
3up+9.png (image/png)
3up+4.png (image/png)
2x2.png (image/png)
2x1.png (image/png)
2up_top+8.png (image/png)
2up_middle+8.png (image/png)
2up_bottom+8.png (image/png)